【问题标题】:Autofac & ASP.NET Core : why ASP.NET Core cannot reach ConfigureContainer method at Startup inheriting from StartupBase?Autofac 和 ASP.NET Core:为什么 ASP.NET Core 在从 StartupBase 继承的 Startup 中无法访问 ConfigureContainer 方法?
【发布时间】:2019-05-05 01:23:09
【问题描述】:

说明:

我正在使用 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 以某种方式获取了基类并尝试从中获取方法,但我无法证明这一点,也找不到合适的词来搜索它。 谁能解释一下为什么这里的简单继承是个问题?

【问题讨论】:

  • @Gibbon 是对的——这完全是 ASP.NET Core 的事情,与 Autofac 无关。如果您相应地更新标签和问题,您可能会更加关注这一点。

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


【解决方案1】:

所以,这实际上更像是微软的东西而不是 Autofac 的东西——在 Microsoft.AspNetCore.Hosting 命名空间内是一个 StartupLoader 类 Github Here。这实际上是选择调用哪些方法。它有一个有趣的怪癖(设计选择),即不调用 Autofac 方法——在 github 上提出了一些相关问题,尽管通常已经关闭,因为这似乎是他们不打算改变的设计选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多