#asp.net-core #asp.net-core-3.1
#asp.net-ядро #asp.net-core-3.1
Вопрос:
У меня есть следующий код, который показывает предупреждение…
Вызов BuildServiceProvider из кода приложения приводит к созданию дополнительной копии одноэлементных сервисов. Рассмотрите такие альтернативы, как службы внедрения зависимостей, в качестве параметров для «Настройки».
Вот сокращенный фрагмент ConfigureServices
, показывающий, как это используется. По сути, мне нужно разрешить AdminDbContext, чтобы передать его в процедуру инициализации.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AdminDbContext>(o => o.UseSqlServer("config settings here"));
CustomerConnectionStrings.Instance.Initialize(services.BuildServiceProvider().GetService<AdminDbContext>());
}
Что мне нужно сделать, чтобы избавиться от этого предупреждения?
Я видел другие сообщения, в которых показано, как это сделать, но я не устанавливаю соединение для своего конкретного варианта использования.
Ответ №1:
Хотя я считаю, что это может быть проблемой XY.
Я бы посоветовал следовать предложениям в предупреждении
Рассмотрите такие альтернативы, как службы внедрения зависимостей, в качестве параметров для «Настройки».
//...
public void ConfigureServices(IServiceCollection services) {
services.AddDbContext<AdminDbContext>(o => o.UseSqlServer("config settings here"));
//...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AdminDbContext adminDb) {
CustomerConnectionStrings.Instance.Initialize(adminDb);
//...
}
Комментарии:
1. Понятия не имею, почему я не установил соединение с фактическим методом настройки. Спасибо, что указали на это!
Ответ №2:
@Nkosi ответ правильный, но в случае, если кто-то ищет альтернативу, вы можете получить любую услугу из приложения:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, AdminDbContext adminDb) {
CustomerConnectionStrings.Instance.Initialize(App.ApplicationServices.GetService<IMyService>());
//...
}
И еще один вариант для всех, кто сталкивается с этим. Иногда лучше работать с одиночными, а не со статическими классами:
Когда вы инициализируете CustomerConnectionStrings
, вы запросите AdminDBContext и передадите его туда.