.NET Core DI эквивалентен Autofac с параметром WithParameter

#c# #asp.net-core #dependency-injection

#c# #asp.net-core #внедрение зависимостей

Вопрос:

Я использую это в Autofac со следующей регистрацией:

 builder.RegisterType<SBOTaskerHelper>()
    .As<ISBOTaskerHelper>()
    .AsSelf()
    .UsingConstructor(
        typeof(IPrincipal),
        typeof(IPortalSettings),
        typeof(ILogger<SBOTaskerHelper>),
        typeof(bool))
    .WithParameter("debugMode", Portal.Site.DebugMode)
    .InstancePerRequest();
 

Переезд в ASP.NET Внедрение зависимостей ядра. Как передать конструкторы и параметры для настройки служб DI?

Комментарии:

1. DI по умолчанию слишком прост, чтобы делать то, что вы хотите. Однако Autofac может интегрироваться в asp.net ядро. Вы можете использовать тот же код, который показан в asp.net основной ДИ. Проверьте документацию здесь autofaccn.readthedocs.io/en/latest/integration /…

2. Спасибо за документацию @Nkosi, это помогло мне понять некоторые моменты, о которых я не знал.

Ответ №1:

Следующая регистрация будет примерно такой же:

 services.AddScoped<SBOTaskerHelper>(
    p => ActivatorUtilities.CreateInstance<SBOTaskerHelper>(
        p, Portal.Site.DebugMode));
services.AddScoped<ISBOTaskerHelper>(
    p => p.GetRequiredService<SBOTaskerHelper>());
 

ActivatorUtilities.CreateInstance является вспомогательным методом MS.DI. Это позволяет создавать заданный тип, где его зависимости разрешаются из предоставленных IServiceProvider , позволяя переопределять аргументы конструктора. В этом случае мы инструктируем MS.DI предоставить Portal.Site.DebugMode первому bool свойству в SBOTaskerHelper конструкторе.

Обратите внимание, что .As<T>().AsSelf() в MS.DI нет. Вам нужно добавить вторую регистрацию и перенаправить регистрацию на предыдущую. Это делается с помощью services.AddXXX<IX>(p => p.GetRequiredService<X>()) .