Зарегистрируйте модуль Autofac и верните IServiceCollection - PullRequest
0 голосов
/ 05 октября 2018

У меня есть конфигурация API, разделенная на два проекта (основной и дополнительный).В основном файле Startup.cs я настраиваю Autofac, а во втором я использую IServiceCollection, возвращаемую принципалом.

Для регистрации модуля Autofac я должен кодировать:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    var container = new ContainerBuilder();
    container.Populate(services);
    container.RegisterModule(new ApplicationModule());
    return new AutofacServiceProvider(container.Build()); // Instead of 'return services;'
}

И если вы видите возвращенный тип, это IServiceProvider вместо IServiceCollection.Как я могу зарегистрировать модуль, но вернуть IServiceCollection?Я попытался привести из IServiceProvider к IServiceCollection, но возникла исключительная ситуация.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Похоже, что ваша настройка автофака неверна.Пожалуйста, взгляните на то, что описано ниже.

Program.cs

 public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureServices(collection => collection.AddAutofac()) //Important
            .Build();

Startup.cs

   public void ConfigureServices(IServiceCollection services)
    {
     services.AddMvc();
    }
    public void ConfigureContainer(ContainerBuilder builder)
    {
      container.RegisterModule(new ApplicationModule());
    }

Из-за строки .ConfigureServices(collection => collection.AddAutofac()) в вашей программеcs ConfigureContainer(ContainerBuilder builder) автоматически вызывается (ставит точку останова :)) в вашем классе запуска, и контейнер создается и регистрируется в вашем текущем API, если вы скопируете это в ваш вторичный API, вам не придется беспокоиться о передаче вашей коллекции сервисов.вокруг одного API к другому, и каждый из них будет регистрировать свои собственные зависимости.

Также убедитесь, что у вас установлен Autofac.Extensions.DependencyInjection пакет nuget!

0 голосов
/ 05 октября 2018

Насколько я вижу, ваш код правильный.Вы должны создать autofac Module во втором проекте, а затем зарегистрировать его в первом проекте, добавив следующий код к методу ConfigureServices:

container.RegisterModule<YourModuleInSecondProject>();

Пожалуйста, найдите хорошую статью об основах autofac здесь .

Также обратите внимание, что ядро ​​dotnet поставляется со встроенным инжектором зависимостей, вы можете найти простое руководство здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...