Внедрение зависимостей для сервисов с отслеживанием состояния

У меня есть служба с отслеживанием состояния Service Fabric, которая содержит как цикл RunAsync, так и прослушиватель веб-API OWIN. Можно ли добавить внедрение зависимостей как в унаследованный класс StatefulService, так и в контроллеры API? Я действительно был в состоянии получить только одно или другое.

Если я помещу логику контейнера в Startup.cs, я смогу легко получить DI для контроллеров веб-API, но не для службы с отслеживанием состояния.

Если я помещу логику контейнера в Program.cs, я смогу получить ее для службы с отслеживанием состояния, но не для веб-API. (на самом деле это больше похоже на сервисный локатор, но в данном случае меня это устраивает)

Программа.cs

private static void Main()
{
    var builder = new ContainerBuilder();

    builder.RegisterModule<MyModule>();

    var container = builder.Build();

    ILogger logger = container.Resolve<ILogger>();

    ServiceRuntime.RegisterServiceAsync("MyService", (context) => new MyService(context, logger)).GetAwaiter().GetResult();
}

Без передачи IContainer в конструктор StatefulService я понятия не имею, как я могу получить его для инициализации запуска для веб-API, чтобы установить DependencyResolver.


person Dismissile    schedule 05.07.2016    source источник
comment
Вы видели это? jamessturtevant.com/posts/   -  person The Bearded Llama    schedule 05.07.2016
comment
@TheBeardedLlama в этом конкретном примере основное внимание уделяется только стороне службы с отслеживанием состояния, и он использует только DI для бедных, а не контейнер.   -  person Dismissile    schedule 05.07.2016


Ответы (1)


У меня есть решение, в котором я создаю контейнер при создании прослушивателя связи.

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new[] {
        new ServiceInstanceListener(CreateOwinCommunicationListener, "owin")
    };
}

private ICommunicationListener CreateOwinCommunicationListener(StatelessServiceContext context)
{
    var container = CreateContainer();
    return new OwinCommunicationListener("api", new Startup(container), context, Log, "WebServiceEndpoint");
}

Если я хочу получить доступ к контейнеру в службе, я также могу это сделать.

person Nick Randell    schedule 05.07.2016
comment
Я надеялся избежать передачи контейнера, но не похоже, что сейчас есть хороший способ сделать это. - person Dismissile; 05.07.2016