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

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

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

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

Program.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, я понятия не имею, как я могу получить его при инициализации запуска для Web API для установки DependencyResolver.

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

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

Другие вопросы по тегам