Регистрация существующего контейнера Autofac с помощью ASP.NET Core - PullRequest
0 голосов
/ 10 января 2019

В настоящее время я создаю серверное приложение, которое говорит по собственному протоколу через TCP. Это серверное приложение в настоящее время использует Autofac для внедрения зависимостей.

Однако недавно я добавил в решение проект ASP.NET Core, чтобы предоставить HTTP API для работы с серверным приложением, главным образом для обеспечения веб-приложения управления.

Autofac обеспечивает интеграцию для проектов ASP.NET Core, но мне трудно понять, как я могу указать конфигурации службы ASP.NET Core использовать уже созданный контейнер службы Autofac, чтобы мой TCP служил и HTTP API может разрешать службы из одного контейнера.

Autofac предоставляет документацию для этого:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    // Add services to the collection.
    services.AddMvc();

    // Create the container builder.
    var builder = new ContainerBuilder();

    builder.Populate(services);
    builder.RegisterType<MyType>().As<IMyType>();
    this.ApplicationContainer = builder.Build();

    // Create the IServiceProvider based on the container.
    return new AutofacServiceProvider(this.ApplicationContainer);
    //                                                   ^
    // This is where I'd like to insert my container ━━━━┛
}

В этом примере показано только, как создать полный контейнер с нуля для приложения ASP.NET Core, а теперь как повторно использовать существующий контейнер.

Использование метода ConfigureServices в IWebHostBuilder здесь не работает, потому что он имеет тип возврата void, поэтому я не могу вернуть AutofacServiceProvider там.

Вот как я запускаю свое приложение:

var containerBuilder = new ContainerBuilder();

// Here's where I register all my services
containerBuilder.RegisterModule(new ApplicationModule());
var container = containerBuilder.Build();

using (var scope = container.BeginLifetimeScope())
{

    var server = scope.Resolve<TcpServer>();

    var isService = args.Contains("--winservice");

    // Construct the HTTP API
    var builder = WebHost
        .CreateDefaultBuilder(args.Where(arg => arg != "--winservice").ToArray())
        .ConfigureServices(collection =>
        {
            // Not sure what to do here?
            // I can call `collection.AddAutofac` here, not sure what that does
        })
        .UseStartup<ApplicationAPI>();

    // Start the HTTP API
    if (isService)
    {
        // Run as a Win Service
        builder.Build().RunAsCustomService(server);
    }
    else
    {
        await server.Start();

        // Do not run as a Win Service
        builder.Build().Run();
    }
}

Так как я могу использовать один и тот же контейнер для разрешения зависимостей как на моем TCP-сервере, так и на HTTP API?

Спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Полагаю, вы сможете заменить стандартный (встроенный) основной контейнер asp.net на ваш контейнер Autofac. В этом случае Startup.ConfigureServices должен возвращать IServiceProvider (а не void).

Посмотрите раздел «Замена сервисного контейнера по умолчанию» в этой документации. Соответствующий раздел находится в конце страницы. Вы должны быть в состоянии приспособить это к вашей ситуации.

Надеюсь, это работает для вас. Если да, отметьте это как ответ.

...