C# ServiceStack AppHost是单例的吗?
我一直在评估ServiceStack,到目前为止,我几乎被卖掉了——但我有一个要求,我认为这将是一个交易破坏者 我基本上需要多个AppHost派生实例。第一个很好地旋转起来,但其余的都失败了,因为“AppHostBase.Instance已经设置好了” 这是否意味着如果我希望多个主机(在不同的URI上)位于不同的可执行文件中?如果是这样的话,这是相当令人失望的,因为除了这个限制,这个库在其他方面都是完美的 如果我错了,有人能给我一个解决方案吗 请允许我详细说明一下。我们计划通过网络提供很多很多服务。我的意图是将它们设计为单独的服务,然后在托管类中“托管”。托管类本身是用于管理目的的服务,并且能够启动和停止服务。它们在网络上是“可发现的”。我们可以在不同的时间或随意在不同的机器上启动和关闭服务 我的计划是为每一件事情使用服务堆栈,并且能够在任何机器和任何“主机”上以特殊方式创建和销毁服务。我唯一遇到的问题是AppHost只初始化了一次C# ServiceStack AppHost是单例的吗?,c#,
servicestack,C#,
servicestack,我一直在评估ServiceStack,到目前为止,我几乎被卖掉了——但我有一个要求,我认为这将是一个交易破坏者 我基本上需要多个AppHost派生实例。第一个很好地旋转起来,但其余的都失败了,因为“AppHostBase.Instance已经设置好了” 这是否意味着如果我希望多个主机(在不同的URI上)位于不同的可执行文件中?如果是这样的话,这是相当令人失望的,因为除了这个限制,这个库在其他方面都是完美的 如果我错了,有人能给我一个解决方案吗 请允许我详细说明一下。我们计划通过网络提供很多很多服
很明显,我做错了什么,所以关于如何在同一个可执行文件中托管多个服务的任何信息都非常有用:)为了回答这个问题,我添加了新的和wiki页面,以强调结构化和模块化ServiceStack服务的不同方法,我将重复这些方法以提高可发现性: 正如您所发现的,ServiceStack对于每个应用程序域都有一个单一应用程序主机。正如您可以从名称推断的那样,主机项目的作用是成为绑定所有服务的管道,具体的依赖项、插件、过滤器以及服务所需的所有其他内容。在
AppHost.Configure()方法中初始化所有内容后,服务的配置应该是不可变的。wiki显示了典型解决方案的推荐物理项目结构
在多个程序集中模块化服务
虽然您只能有一个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) {}
}
您还可以通过覆盖CreateServiceManager
,提供自己的策略来发现和解析ServiceStack应该自动连接的服务类型,例如:
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());
}
}
有关物理布局项目的推荐方法,请参见此部分。因此,您希望在同一进程的不同端口号上提供多个服务吗?使用Servicestack的Route属性,我的软件上有四个端点:http://+:12000/route1、http://+:12000/route2等@Brannon,各个服务可以随时消失和重新出现。我不确定这是否有帮助。出于这个原因,它们也在自己的URI上,可以在网络的一个点消失,而在另一个点出现。目录服务用来发现东西在哪里。非常感谢您的及时回复。我很难想象其他程序集中服务的类是什么。显然,它们不是从AppHost派生的。因此,我还假设所有服务都有一个Uri,但路由是根据传递的类型确定的?我认为这可能是一个完美的解决方案。此外,我可以在以后注册这些组件,还是必须在施工时注册?如果没有,我可以解决这个问题。所有服务都有一个URI?您可以指定ServiceStack安装位置的/root
,然后所有服务都来自该根目录,但它们可以具有任何自定义url结构。是必须在构造时指定程序集(构造发生在App_Start中的任何位置),同时在AppHost.Configure()中指定所有其他配置。您可以使用上面显示的appHost.RegisterService(“/path”)
手动注册服务。非常感谢您的回复。出于某种原因,我仍然难以想象我的一项服务如何“上线”,然后又可以“离线”,或者有效地取消注册。在构造时向AppHost提供程序集实际上不是问题,因为配置文件是在启动时处理的,我知道所有可能提前提供服务的程序集。只是想看看这是怎么回事。非常感谢,请继续努力,为社区提供如此出色、自给自足、重量轻和高性能的解决方案:)
Plugins.Add(new BasicAuthFeature { HtmlRedirect = "~/login" });