Как вызвать services.Configure из метода Configure в Startup.cs - PullRequest
2 голосов
/ 26 апреля 2020

В ConfigureServices () в моем файле Startup.cs я называю это

if (services.BuildServiceProvider().GetService<IWebHostEnvironment>().IsDevelopment()) {
 services.Configure<EnvironmentSettings>(Configuration.GetSection("WebServicesDevelopment"));
} else {
 services.Configure<EnvironmentSettings>(Configuration.GetSection("WebServicesProduction"));
}

Я получаю предупреждение о сборке, говорящее

Вызов «BuildServiceProvider» из результатов кода приложения в дополнительной копии создаваемых одноэлементных сервисов. Рассмотрим альтернативы, такие как сервисы внедрения зависимостей в качестве параметров для 'Configure'

Как мне вызвать это из Configure () с IApplicationBuilder?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Сначала проверьте поддержку нескольких сред в ASP. NET Core . Вы можете настроить разделы среды c, чтобы избежать использования в коде оператора if-else.

Теперь предположим, что вышеприведенное не работает для вас:

Вам следует избегать построения контейнер в методе ConfigureServices по причине, указанной в предупреждающем сообщении.

Вместо этого следует использовать шаблон параметров :

services.AddOptions<EnvironmentSettings>()
    .Configure<IConfiguration, IWebHostEnvironment>(
        (settings, config, env) =>
        {
            if (env.IsDevelopment())
            {
                config.GetSection("WebServicesDevelopment").Bind(settings);
            }
            else
            {
                config.GetSection("WebServicesProduction").Bind(settings);
            }
        });
0 голосов
/ 26 апреля 2020

Как говорится в предупреждении, вызов BuildServiceProvider может иметь непреднамеренные побочные эффекты и является анти-паттерном. Службы предназначены для настройки в ConfigureServices, и у нас есть все необходимые инструменты для выполнения условной конфигурации в зависимости от среды. Просто введите IWebHostEnvironment в конструктор класса Startup и настройте свои службы соответствующим образом:

public class Startup
{
    private readonly IWebHostEnvironment _env;

    public Startup(IConfiguration configuration, IWebHostEnvironment env /* take dependency on environment */)
    {
        Configuration = configuration;
        _env = env; // store environment
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // configure based on environment
        if (_env.IsDevelopment())
        { 
            services.Configure<EnvironmentSettings>(Configuration.GetSection("WebServicesDevelopment"));
        } 
        else 
        {
           // non-dev services
           services.Configure<EnvironmentSettings>(Configuration.GetSection("WebServicesProduction"));
        }
    }
}

См. Следующую документацию: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1 найдите фразу "Только Следующие типы сервисов могут быть внедрены "

Эта ссылка содержит дополнительную информацию, включая информацию о том, как можно даже использовать несколько классов Startup или несколько методов ConfigureServices (для среды)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...