【问题标题】:Using Autofac with ASP.Net Core 3.1 generic host "Worker Service" application将 Autofac 与 ASP.Net Core 3.1 通用主机“Worker Service”应用程序一起使用
【发布时间】:2020-04-25 22:42:15
【问题描述】:

在 ASP.Net Core 应用程序中,可以使用以下方法轻松配置 Autofac:

public class Program
{
  public static void Main(string[] args)
  {
    // ASP.NET Core 3.0+:
    // The UseServiceProviderFactory call attaches the
    // Autofac provider to the generic hosting mechanism.
    var host = Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureWebHostDefaults(webHostBuilder => {
          webHostBuilder
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>();
        })
        .Build();

    host.Run();
  }
}

public class Startup
{
  // Omitting extra stuff so you can see the important part...
  public void ConfigureServices(IServiceCollection services)
  {
    // Add controllers as services so they'll be resolved.
    services.AddMvc().AddControllersAsServices();
  }

  public void ConfigureContainer(ContainerBuilder builder)
  {
    // If you want to set up a controller for, say, property injection
    // you can override the controller registration after populating services.
    builder.RegisterType<MyController>().PropertiesAutowired();
  }
}

但在通用主机中,Worker 类 没有对ConfigureServicesConfigureContainer 的任何内置支持。

如何在非 ASP.Net Core 应用程序中为通用主机启用相同功能?

【问题讨论】:

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


    【解决方案1】:

    generic host builder 确实内置了对 ConfigureContainerConfigureServices 的支持

    var host = Host.CreateDefaultBuilder(args)
        .UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .ConfigureContainer<ContainerBuilder>(builder => {
    
            builder.RegisterType<MyDependencyType>();
    
            //...
        })
        .ConfigureServices(services => {
    
            services.AddHostedService<Worker>();
    
            //...
        })
        .ConfigureWebHostDefaults(webHostBuilder => {
            webHostBuilder
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>();
        })
        .Build();
    
    host.Run();
    

    参考.NET Generic Host

    【讨论】:

    • 在这种情况下你会如何调用 UseStartup?
    • @MaulikModi 检查docs here。它将在ConfigureWebHostDefaults 扩展中调用
    【解决方案2】:

    添加到@Nkosi 的出色答案:

    如果您还需要从 ConfigureContainer 访问一些配置数据,请使用 (hostContext, services) 重载:

        // ...    
        .ConfigureContainer<ContainerBuilder>((hostContext, builder) =>
              {
                 IConfiguration configuration = hostContext.Configuration;
                 var myDbConnectionString = configuration.GetConnectionString("MyDbConnection");
    
                 builder.RegisterType<MyDependencyType>();
              }))
        // ... 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多