我一直在评估ServiceStack,到目前为止,我已经出售了很多 - 但我有一个要求,我认为这将成为一个交易破坏者.
我基本上需要多个AppHost派生的实例.第一个很好地旋转,但其余的失败,因为"AppHostBase.Instance已经设置".
这是否意味着如果我想要多个主机(在不同的Uris上),在不同的可执行文件中?如果是这样,这是相当令人失望的,因为除了这个限制之外,这个库在其他方面都是完美的.
如果我错了,有人能指出我的解决方案吗?
请允许我详细说明一下.我们计划通过网络提供许多服务.我的目的是将它们设计为单独的服务,然后在托管类中"托管".托管类本身是用于管理目的的服务,并且具有启动和停止服务的能力.它们在整个网络中是"可被发现的".我们可以在不同时间或不同时间启动和降低不同机器上的服务.
我的计划是为每个事物使用服务堆栈,并且能够在任何机器和任何"主机"上以临时方式创建和销毁服务.我唯一磕磕绊绊的是AppHost只被初始化一次.
显然我做错了,所以关于如何在同一个可执行文件中托管多个服务的任何信息都会很棒:)
myt*_*thz 12
为了回答这个问题,我添加了新的模块化服务和物理项目结构维基页面,以突出构建和模块化ServiceStack服务的不同方式,我将重复听到它的可发现性:
正如您所发现的,ServiceStack 为每个App Domain 都有一个App Host.正如您可能从名称中推断出的那样,Host项目的作用是成为绑定所有服务的具体依赖项,插件,过滤器以及您的服务所需的所有其他内容的管道.在您的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) {}
}
Run Code Online (Sandbox Code Playgroud)
您还可以提供自己的策略来发现和解决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())));
}
}
Run Code Online (Sandbox Code Playgroud)
模块化服务的一种方法是将它们封装在插件中,允许您手动注册服务,自定义路由,过滤器,内容类型,允许自定义以及模块所需的任何其他内容.
为了说明这一点,我们将展示Basic Auth Feature示例的外观:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
将所有内容封装在插件中,您的用户可以在AppHost中轻松启用它们:
Plugins.Add(new BasicAuthFeature { HtmlRedirect = "~/login" });
Run Code Online (Sandbox Code Playgroud)
请参阅前面的答案,了解物理布局项目的建议方法.
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |