Как избавиться от предупреждения «Вызов BuildServiceProvider» из кода приложения …»

#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 и передадите его туда.