【问题标题】:Dependency Injection into Autofac Module in .NET Core 3.0.NET Core 3.0 中 Autofac 模块的依赖注入
【发布时间】:2020-11-24 13:16:01
【问题描述】:

我对创建和注册模块还很陌生,但我正在努力更好地理解整个过程。目前我正在尝试将依赖项注入到 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 配置”。

【问题讨论】:

  • 您能提供您的注册模块代码吗?
  • @Changemyminds 我已经用我的 CreateHostBuilder 方法更新了问题。

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


【解决方案1】:

只修复了SecurityModule
您可以通过Load 方法在SecurityModule 中创建IConfiguration
移除 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&lt;TModule&gt;() TModule 是一个新的约束意味着你必须有一个公共的无参数默认构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多