NET Core 3.0中的依赖注入到Autofac模块中

时间:2020-08-04 12:29:59

标签: asp.net-core autofac autofac-configuration autofac-module

我对创建和注册模块还很陌生,但是我试图对整个过程有一个更好的了解。当前,我正在尝试将依赖项注入到autofac模块中,但我认为问题在于autofac在进行依赖项注入之前就注册了其模块。这是我的安全模块:

 public class SecurityModule : Module
{
    private readonly IConfiguration configuration;

    public SecurityModule(IConfiguration configuration)
    {
        this.configuration = configuration;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<TeamManager>()
          .WithParameter("tenantName", this.configuration["TenantName"])
          .InstancePerDependency();
    }
}

这是program.cs中我注册模块的部分:

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureContainer<ContainerBuilder>(builder =>
            {
                builder.RegisterAssemblyModules(typeof(Startup).Assembly);
                builder.RegisterModule<LoggingModule>();
                builder.RegisterModule(new ConfigurationModule(args));
                builder.RegisterModule<CXDatabaseModule>();
                builder.RegisterModule<SecurityModule>();
            })
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.AddLog4Net();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(options =>
                {
                    options.Limits.MaxRequestBodySize = 209715200;
                });

                webBuilder.UseStartup<Startup>();
            })
            .UseNServiceBus((configuration, container) =>
            {
                return CreateStartableEndpoint(configuration, container);
            });
    }

这是我收到的错误。有没有可能指定该模块在以后阶段注册的方法?还是我缺少重要的信息?

DependencyResolutionException:对于类型为'inQuba.CX.Web.Api.AutofacIntegration.SecurityModule'的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'发现的构造函数均不能使用可用的服务和参数来调用: 无法解析构造函数“ Void .ctor(Microsoft.Extensions.Configuration.IConfiguration)”的参数“ Microsoft.Extensions.Configuration.IConfiguration配置”。

1 个答案:

答案 0 :(得分:0)

仅固定SecurityModule
您可以通过IConfiguration方法在SecurityModule中创建Load
删除SecurityModule构造函数和IConfiguration字段。

public class SecurityModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        // create configuration by your appsettings.json
        var configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("appsettings.json");
        var configuration = configurationBuilder.Build();

        builder.RegisterType<TeamManager>()
          .WithParameter("tenantName", configuration["TenantName"])
          .InstancePerDependency();
    }
}

注意:builder.RegisterModule<TModule>(),其中TModule是一个新约束,意味着您必须具有一个无参数的默认默认构造函数。