Как использовать службу Service Fabric с AspNet Core WebApi и Autofac и запустить TestServer
Я не могу понять, как использовать AspNet Core 3.1 Web Api с Service Fabric и Autofac, а также как подготовить его для запуска TestServer для интеграции / функционального тестирования.
Документация очень неполная.
Документация Autofac показывает, как изменить
Program.cs
для создания контейнера autofac, но в нем ничего не говорится о классе Startup.cs, который есть во всех веб-API: https://autofaccn.readthedocs.io/en/latest/integration/servicefabric.html
Также единственный пример Autofac для служебной сети - это не веб-API: https://github.com/autofac/Examples/tree/master/src/ServiceFabricDemo
Есть и другие вопросы, на которые нет правильных ответов: Service Fabric AspNet Core 3.1 Autofac WebHostBuilder
Есть ли у кого-нибудь пример того, как этого добиться?
Я могу добиться следующего (см. Мой репозиторий GitHub с образцом)
- Service Fabric с проектом AspNet Core WebApi без сохранения состояния (ядро dotnet 3.1)
- Использование Microsoft Dependency Injection для регистрации служб
- Использование TestServer для запуска интеграционных тестов на конечной точке http и возможность перезаписать регистрации внедрения зависимостей чистым способом без необходимости создания другого класса Startup
Я хочу то же самое, но с использованием Autofac в качестве контейнера DI.
ОБНОВЛЕНИЕ 1: я не могу добавить Autofac в
WebHostBuilder
и
ConfigureServices(IServiceCollection services)
должен быть недействительным в соответствии с AspNet Core 3.1+, так что здесь я застрял. Как заменить MS Dependency Injection в моем примере
2 ответа
Событие после награды на это нет ответа. Возможно, это невозможно, поскольку для служебной сети требуется WebHost, а не общий хост.
В любом случае мне удалось заставить его работать со старыми версиями. Вот мой репозиторий, где я показываю пример запуска AspNetCore2.1 с DotNetCore2.1 (LTS) и Autofac в Service Fabric. Я использую конструктор веб-хостов, а не общий.
Тем не менее, было бы неплохо получить в конце концов верный ответ на вопрос.
Я не знаю, работает ли это для TestServer. Однако он отлично работает при обычном хостинге.
То, что вы ищете, будет этой строкой:
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<ContainerBuilder>>(new AutofacServiceProviderFactory(null)));
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener(
serviceContext => new KestrelCommunicationListener(
serviceContext,
(url, listener) =>
{
return WebHost
.CreateDefaultBuilder()
.ConfigureServices(services =>
{
services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<ContainerBuilder>>(new AutofacServiceProviderFactory(null)));
services.AddSingleton(serviceContext)
})
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl | ServiceFabricIntegrationOptions.UseReverseProxyIntegration)
.UseStartup<TStartupType>()
.Build();
}))
};
}
Надеюсь, это поможет, мне потребовалось довольно много времени, чтобы прийти к этому решению.