Корневой поставщик, введенный в услугу, решен от поставщика новой областиC#

Место общения программистов C#
Anonymous
Корневой поставщик, введенный в услугу, решен от поставщика новой области

Сообщение Anonymous »

У меня есть серверное приложение Blazor. У меня есть IHostedService, предназначенный для выполнения задач запуска в методе StartAsync():

Код: Выделить всё

builder.Services.AddHostedService();
В него встроен конструктор IServiceScopeFactory. Он создает новую область:

Код: Выделить всё

var provider = serviceScopeFactory
.CreateScope()
.ServiceProvider;
provider
.GetRequiredService()
.ReturnMyCtorInjectedProvider()
.GetRequiredService();
где EntityService — это DbContext, который получает внедренный конструктором IServiceProvider.
Насколько мне известно, поскольку EntityService был получен из IServiceProvider определенной области, он должен получить IServiceProvider, который также привязан к той же области, и разрешение той же службы из нее должно привести к тому же поведению, что и ее разрешение из IServiceProvider вновь созданной области, но получаю хорошо известную ошибку:

Службу с областью действия не удалось разрешить от корневого поставщика

Похоже, что в конструктор был внедрен корневой поставщик, но чем объясняется такое поведение? Что мне не хватает?
Полный код — это конструктор EntityService:

Код: Выделить всё

public class EntityService (DbContextOptions options,
IServiceProvider serviceProvider,
IEncryptionService encryptionService) : DbContext(options)
{
// ...
}
Это конструктор моего IHostedService:

Код: Выделить всё

public class StartupCleaner(IServiceScopeFactory serviceScopeFactory) : IHostedService
{
// ...
}
Вот их регистрации:

Код: Выделить всё

builder.Services.AddDbContextPool(
opts => opts.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
);
builder.Services.AddHostedService();
Это метод, вызываемый при запуске StartupCleaner:

Код: Выделить всё

public Task StartAsync(CancellationToken cancellationToken)
{
var sp = serviceScopeFactory
.CreateScope()
.ServiceProvider;

var entityService = sp.GetRequiredService();
entityService.ReturnMyCtorInjectedProvider()
.GetRequiredService();
// ...
}
Это метод в EntityService:

Код: Выделить всё

public IServiceProvider ReturnMyCtorInjectedProvider()
{
return serviceProvider;
}
Я получаю сообщение об ошибке:

Невозможно разрешить ограниченную службу «Axoneckend.Services.EntityService» от корневого поставщика

Вернуться в «C#»