Почему я получаю только ошибки разрешения служб с определенной областью в средах разработки? - PullRequest
1 голос
/ 01 августа 2020

Мне известно, что причина описанной ниже ошибки заключается в том, что мне нужна область действия для создания экземпляра службы, что может быть выполнено с помощью Services.CreateScope() и сопоставления .Dispose() / using. Вопрос в том, почему у меня разное поведение в средах разработки и производства.

У меня есть консольное приложение. NET Core 3.1, которое использует . NET Generi c Host для внедрения зависимостей. Внутри него у меня есть EF Core DbContext, определенный как ограниченная служба для доступа к базе данных с использованием AddDbContext, как показано ниже:

var host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        var configuration = hostContext.Configuration;

        services
            .AddDbContext<BotDbContext>(options =>
            {
                options
                    .UseLazyLoadingProxies()
                    .UseSqlite(configuration.GetConnectionString("Database"));
            });
    });
var db = host.Services.GetRequiredService<BotDbContext>();

Первоначально я тестировал это в среде (DOTNET_ENVIRONMENT) как Production по умолчанию. Все работало.

Я хотел отдельную Development среду, чтобы приблизить mimi c стандартные ASP. NET основные шаблоны. Для этого я определил переменную среды времени отладки DOTNET_ENVIRONMENT=Development.

Как только я это сделал, я получил следующее исключение:

System.InvalidOperationException: 'Cannot разрешить службу с ограниченной областью действия «MyNamespace.Data.BotDbContext» от поставщика root.

Почему это исключение возникает только в том случае, если среда Development, но не Production?

1 Ответ

3 голосов
/ 01 августа 2020

Вы создали свой хост, используя CreateDefaultBuilder. При более внимательном рассмотрении документации мы можем увидеть один из элементов конфигурации по умолчанию:

включает проверку области в контейнере внедрения зависимости, когда EnvironmentName имеет значение «Development»

Мы также можем видеть в исходном коде , что он устанавливает ValidateScopes на ServiceProvider только в средах разработки.

С этой конфигурацией вне Среды разработки настроенный ServiceProvider с радостью вернет службы с заданной областью действия вне контекстов с заданной областью (хотя на это никогда нельзя полагаться; эти службы ограничены областью действия по какой-то причине!).

...