Корневой поставщик, введенный в услугу, решен от поставщика новой области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 определенной области, он должен получить IServiceProivder, который также привязан к той же области, и разрешение той же службы из него должно привести к тому же поведению, что и ее разрешение из 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#»