#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>())
.