我一直在评估ServiceStack,到目前为止,我已经卖了很多东西-但我有一个要求,我认为它将成为交易突破者。

我基本上需要多个AppHost派生的实例。第一个旋转得很好,但是其他失败,因为“AppHostBase.Instance已经设置”。

这是否意味着如果我希望多个主机(位于不同的Uris上)位于不同的可执行文件中?如果是这样的话,这是相当令人失望的,因为除了此限制之外,该库在其他所有方面都是完美的。

如果我错了,谁能指出我的解决方案?

请允许我详细说明一下。我们为网络上的许多服务制定了计划。我的意图是将它们设计为单独的服务,然后“托管”在托管类中。托管类本身是用于管理目的的服务,并且具有启动和停止服务的能力。它们在整个网络中都是“可发现的”。我们可以在不同时间或随意在不同的计算机上启动和关闭服务。

我的计划是将服务堆栈用于所有这些事情,并能够以临时方式在任何计算机和任何“主机”上创建和销毁服务。我绊脚的唯一一件事是AppHost只被初始化了一次。

显然我做错了,所以有关如何在同一可执行文件中托管多个服务的任何信息都很棒:)

最佳答案

为了回答这个问题,我添加了新的Modularizing servicesPhysical project structure Wiki页面,以突出显示结构化和模块化ServiceStack服务的不同方式,为了发现性,我将重复这些方式:

如您所见,ServiceStack为每个App域都有一个单个App Host 。正如您可能从名称中推断出的那样,主机项目的作用是充当绑定(bind)所有服务具体依赖关系,插件,过滤器和服务所需的所有其他内容的 channel 。在AppHost.Configure()方法中初始化所有内容后,服务的配置应该是不变的。 Physical project structure wiki page Wiki显示了针对典型解决方案的建议物理项目结构。

在多个程序集中模块化服务

虽然您只能拥有1个AppHost,但可以通过在AppHostBase构造函数中提供Assemblies来将服务分散在多个程序集中。

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())));
    }
}

将服务封装在插件中

服务模块化的一种方法是将它们封装在Plugins中,这使您可以手动注册服务,自定义路由,过滤器,内容类型,允许自定义以及模块需要的其他任何功能。

为了说明这一点,我们将显示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());
    }
}

将所有内容封装在插件中,您的用户可以使用以下命令轻松地在AppHost中启用他们:
Plugins.Add(new BasicAuthFeature { HtmlRedirect = "~/login" });

Physical Project Structure

有关物理布局项目的推荐方法,请参见earlier answer

关于c# - ServiceStack AppHost是单例吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15850226/

10-15 09:12