Внедрение зависимостей в модуль Autofa c в. NET Core 3.0 - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в создании и регистрации модулей, но я пытаюсь лучше понять процесс в целом. В настоящее время я пытаюсь внедрить зависимость в модуль autofa c, но я думаю, что проблема в том, что autofa c регистрирует свои модули до того, как может произойти внедрение зависимости. Вот мой модуль безопасности:

 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: ни один из конструкторов, найденных с 'Autofa c .Core.Activators.Reflection.DefaultConstructorFinder' на тип 'inQuba.CX.Web. Api.AutofacIntegration.SecurityModule 'может быть вызван с доступными службами и параметрами: Невозможно разрешить параметр' Microsoft.Extensions.Configuration.IConfiguration configuration 'конструктора' Void .ctor (Microsoft.Extensions.Configuration.IConfiguration) '.

1 Ответ

0 голосов
/ 05 августа 2020

Только фиксировано SecurityModule.
Вы можете создать IConfiguration в своем методе SecurityModule by 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 - новое ограничение означает, что у вас должен быть конструктор по умолчанию publi c без параметров.

...