Как использовать службу 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 в моем образце


person diegosasw    schedule 08.10.2020    source источник


Ответы (2)


Событие после награды на это нет ответа. Возможно, это невозможно, поскольку для служебной сети требуется WebHost, а не общий хост.

В любом случае мне удалось заставить его работать со старыми версиями. Вот мой репозиторий, где я показываю пример того, как запускать AspNetCore2.1 с DotNetCore2.1 (LTS) и Autofac в Service Fabric. Я использую конструктор веб-хостов, а не общий.

https://gitlab.com/sunnyatticsoftware/training/sasw-aspnetcore-testing/-/tree/master/aspnetcore2_1_autofac_servicefabric

Тем не менее, было бы неплохо получить в конце концов верный ответ на вопрос.

person diegosasw    schedule 15.10.2020

Я не знаю, работает ли это для 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();
                    }))
    };
}

Надеюсь, это поможет, мне потребовалось довольно много времени, чтобы прийти к этому решению.

person Esben Bach    schedule 26.02.2021