我一直在评估ServiceStack,到目前为止,我已经几乎售-但我有,我认为将是一个交易断路器的要求。
基本上,我需要多APPHOST衍生实例。 第一个好听旋转起来,但其余的失败,因为“AppHostBase.Instance已设置”。
这是否意味着,如果我想多台主机(在不同的URI),是在不同的可执行文件? 如果是这样,这是相当令人失望的,因为这个库比这个限制完美在每一个其他的方式,其他。
如果我错了,任何人都可以指向我一个解决方案吗?
请允许我阐述了一点。 我们对整个网络很多很多的服务计划。 我的本意是,它们被设计为单独的服务,然后在托管班“托管”。 托管类本身是为了管理而服务,并启动和停止服务的能力。 他们在网络上“发现”。 我们可以旋转起来在不同的时间降速在不同机器上的服务,或随意。
我的计划是使用服务堆栈的每这些事情,必须创建并在任何机器上,在任何“主机”消灭在ad-hoc方式的服务的能力。 我跌跌撞撞上的唯一的事情是APPHOST只被初始化一次。
很显然,我做错了什么,所以如何在同一个可执行文件托管多个服务上的任何信息将是巨大的:)
在回答这个问题,我已经添加了新的模块化中的服务和体育项目结构 wiki页面,突出结构的不同方式,模块化ServiceStack服务,我会重复听到曝光率:
正如你已经发现,ServiceStack针对每个应用程序域的单一应用主机 。 正如你也许能够从名称来推断, 主体项目的作用是对于结合是所有服务混凝土的依赖,插件,过滤器和其他所有的服务需求的管道。 一切都在你的初始化后,你的服务的配置应该是一成不变的AppHost.Configure()
方法。 该体育项目结构维基页面维基显示了典型的解决方案建议的物理项目结构。
在多个组件模块化服务
虽然你只能有1个APPHOST,服务可以在多个组件通过提供在AppHostBase构造,如大会蔓延:
public class AppHost : AppHostBase
{
//Tell Service Stack the name of your application and which assemblies to find your web services
public AppHost() : base("Hello ServiceStack!",
typeof(ServicesFromDll1).Assembly, ServicesFromDll2).Assembly /*, etc */) { }
public override void Configure(Container container) {}
}
您也可以提供自己的战略,发现和解决服务类型ServiceStack应该通过重写自动线CreateServiceManager
,如:
public class AppHost : AppHostBase
{
public AppHost() : base("Hello ServiceStack!", typeof(ServicesFromDll1).Assembly) { }
public override void Configure(Container container) {}
//Provide Alternative way to inject IOC Container + Service Resolver strategy
protected virtual ServiceManager CreateServiceManager(params Assembly[] assembliesWithServices)
{
return new ServiceManager(new Container(),
new ServiceController(() => assembliesWithServices.ToList().SelectMany(x => x.GetTypes())));
}
}
封装内插件服务
模块化服务的一种方式是,把它们封装内的插件 ,它允许你手动注册服务,定制路线,过滤器,内容类型,允许定制和其他任何你的模块的需求。
为了说明这一点,我们将展示一个基本什么身份验证功能的例子可能是这样的:
public class BasicAuthFeature : IPlugin
{
public string HtmlRedirect { get; set; } //User-defined configuration
public void Register(IAppHost appHost)
{
//Register Services exposed by this module
appHost.RegisterService<AuthService>("/auth", "/auth/{provider}");
appHost.RegisterService<AssignRolesService>("/assignroles");
appHost.RegisterService<UnAssignRolesService>("/unassignroles");
//Load dependent plugins
appHost.LoadPlugin(new SessionFeature());
}
}
随着一切都封装在一个插件内,用户可以很容易地让他们与你的APPHOST:
Plugins.Add(new BasicAuthFeature { HtmlRedirect = "~/login" });
体育项目结构
看到这个刚才的答复上推荐的方法进行物理布局项目。