Внедрение зависимостей для состояний услуг
У меня есть служба состояний 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");
}
Если я хочу получить доступ к контейнеру в сервисе, я тоже могу это сделать.