Autofac & ASP.NET Core: почему ASP.NET Core не может получить доступ к методу ConfigureContainer при запуске, наследуя от StartupBase? - PullRequest
0 голосов
/ 03 декабря 2018

Описание:

Я создаю приложение ASP.NET Core, используя Autofac, поэтому я следую документации, приведенной для него: https://autofaccn.readthedocs.io/en/latest/integration/aspnetcore.html, должен быть довольно простой путь, но яУ меня есть проблема, мой класс Statup наследуется от Microsoft.AspNetCore.Hosting.StartupBase, что заставляет меня реализовать следующее:

public abstract class StartupBase : IStartup
{
      protected StartupBase();

      public abstract void Configure(IApplicationBuilder app);
      public virtual void ConfigureServices(IServiceCollection services);
      public virtual IServiceProvider CreateServiceProvider(IServiceCollection services);
}

пока все в порядке, мой класс Statup выглядит следующим образом

public class Startup : StartupBase
{
  readonly IHostingEnvironment hostingEnvironment;

  public Startup(IHostingEnvironment hostingEnvironment)
  {
     //some stuff here
  }

  public override void ConfigureServices(IServiceCollection services)
  {
     //some other stuff here
  }

  // https://autofaccn.readthedocs.io/en/latest/integration/aspnetcore.html
  public void ConfigureContainer(ContainerBuilder builder)
  {
     builder.RegisterModule(new AutofacModule());        
  }

  public override void Configure(IApplicationBuilder app)
  {
     //more stuff here
  }     
}    

и Program.cs, просто для примера. Вот пример:

public class Program
{
  public static void Main(string[] args)
  {
    // The ConfigureServices call here allows for
    // ConfigureContainer to be supported in Startup with
    // a strongly-typed ContainerBuilder.
    var host = new WebHostBuilder()
        .UseKestrel()
        .ConfigureServices(services => services.AddAutofac())
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
  }
}

Проблема:

После запуска приложения оно должно вызвать метод ConfigureContainer, но это не так.t и я не знаю почему, что означает, что я не могу ввести что-либо, зарегистрированное в классе AutofactModule, мне удается решить эту проблему, но я хочу знать, что происходит за кулисами,

Исправление:

Я удалил наследование из StartupBase и все прошло нормально

Теория:

Я подозреваю, что как-то Autofac в .UserStartup получаетбазовый класс и пытается получить методы из него, но я не могу доказать это и не смог найти правильные слова для его поиска. Может кто-нибудь объяснить мне, почему простое наследование является проблемой здесь?

1 Ответ

0 голосов
/ 03 декабря 2018

Итак, это на самом деле скорее вещь Microsoft, чем вещь Autofac - в пространстве имен Microsoft.AspNetCore.Hosting находится StartupLoader Class Github Here .Это то, что на самом деле выбирает, какие методы вызываются.У него есть интересная особенность (выбор дизайна) - не вызывать методы Autofac - на github возникла пара связанных с этим проблем, хотя в целом они были закрыты, так как кажется, что это выбор дизайна, который они не намерены менять

...