ServiceStack AppHost является Одноэлементным?

я оценивал ServiceStack и до сих пор, я был в значительной степени продан - но у меня есть требование, что я думаю будет сделки.

Мне в основном нужно несколько экземпляров, производных от AppHost. Первый раскручивается хорошо, но остальное не так "AppHostBase.Экземпляр уже установлен".

означает ли это, что если я хочу, чтобы несколько хостов (на разных URI) были в разных исполняемых файлах? Если это так, это довольно разочаровывает, поскольку эта библиотека совершенна во всех отношениях, кроме этого ограничения.

Если я ошибаюсь, может ли кто-нибудь указать мне на решение?

позвольте мне немного разъяснить. У нас есть планы для многих услуг через сеть. Мое намерение состоит в том, что они разработаны как отдельные службы, а затем "размещены" в классе хостинга. Сам класс хостинга является сервисом для административных целей и имеет возможность запускать и останавливать службы. Они "обнаружить" по сети. Мы можем вращать и вращать службы на разных машинах в разное время или по желанию.

мой план состоял в том, чтобы использовать service-stack для каждой из этих вещей и иметь возможность создавать и уничтожать сервисы ad-hoc на любой машине и в любом "хосте". Единственное, что я наткнуться на это AppHost только после инициализации.

очевидно, я делаю что-то неправильно, поэтому любая информация о том, как разместить несколько услуг в одном исполняемый файл будет отличным :)

1 ответов


в ответ на этот вопрос я добавил новый услуги разбивая и физическая структура проекта вики-страницы, чтобы выделить различные способы структурирования и модульной ServiceStack услуг, которые я повторю услышать для обнаружения:

как вы обнаружили, ServiceStack имеет один хост приложения для каждого домена приложения. Как вы могли бы сделать вывод из имени, роль Хоста будет conduit для привязки всех ваших сервисов конкретные зависимости, Плагины, фильтры и все остальное, что нужно вашему сервису. Конфигурация вашего сервиса должна быть неизменной после того, как все будет инициализировано в вашем AppHost.Configure() метод. The физическая структура проекта wiki страница wiki показывает рекомендуемую физическую структуру проекта для типичных решений.

модульные службы в нескольких сборках

пока вы можете только иметь 1 AppHost, обслуживания могут быть распространение по нескольким сборкам путем предоставления сборок в конструкторе AppHostBase, e.g:

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

инкапсуляция сервисов внутри плагинов

один из способов услуги разбивая, чтобы инкапсулировать их в Плагины что позволяет вручную зарегистрировать службы, пользовательские маршруты, фильтры, типы контента, позволяют настраивать и все остальное, что нужно вашему модулю.

чтобы проиллюстрировать этот момент, мы покажем, что такое Basic Функция Auth пример может выглядеть так:

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

Физическая Структура Проекта

посмотреть этот ранее ответа на рекомендуемый способ физической компоновки проекта.