Autofac和ASP.NET Core:为什么ASP.NET Core在启动时无法从StartupBase继承而到达ConfigureContainer方法?

时间:2018-12-03 17:41:11

标签: c# asp.net-core dependency-injection autofac autofac-configuration

说明:

我正在使用Autofac创建一个ASP.NET Core应用程序,因此我遵循为它提供的文档: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方法,但是不会,我也不知道为什么,这意味着我无法注入在AutofactModule类中注册的任何内容,我设法解决了这个问题,但是我想知道幕后发生的事情

修复:

我已从StartupBase删除继承,一切正常

理论:

我怀疑.UserStartup中的Autofac会以某种方式获取基类并尝试从中获取方法,但是我无法证明它,也找不到正确的词来进行搜索。 有人可以向我解释为什么简单继承是这里的问题吗?。

1 个答案:

答案 0 :(得分:2)

因此,实际上这比Microsoftfac更像是Microsoft的东西-Microsoft.AspNetCore.Hosting名称空间中的StartupLoaderGithub Here。这实际上是选择调用哪些方法的方法。不调用Autofac方法有一个有趣的怪癖(设计选择)-github上引发了一些相关问题,尽管通常已经关闭,因为这似乎是他们不打算更改的设计选择