Как внедрить репозиторий в. net core 3.1 фоновый сервис? - PullRequest
0 голосов
/ 19 апреля 2020

В asp. net ядре 3.1 веб-приложения. У меня есть прослушиватель событий, унаследованный от класса BackgroundService. Почему в хранилище инъекций, в которое вставлен DbContext, возникает ошибка?

Запуск:

    services.AddDbContext<DBContext>(options => {
        options.UseSqlServer("...connection string...");
    });

    services.AddTransient<ICalStatRepo, CalStatRepo>();
    services.AddTransient<IHostedService, BackgroundListener>();

Репозиторий:

public class CalStatRepo : ICalStatRepo
{
    private readonly DBContext _context;

    public CalStatRepo(DBContext context)
    {
        _context = context;
    }

    public async Task InsertCallStat(RawCallStatRegisterViewModel model)
    {
        var rawCall = new RawCallStat
        {
            HappenedAt = model.HappenedAt,
            Source = model.Source,
            Destination = model.Destination,
            Status = model.Status
        };

        _context.Entry(rawCall).State = EntityState.Added;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (Exception e)
        {
            throw new Exception("Insert new call stat fails with this error : " + e.Message);
        }
    }
}

Фоновая служба:

public class BackgroundListener : BackgroundService
{
    private readonly IServiceProvider _service;

    public BackgroundListener(IServiceProvider service)
    {
        _service = service;
    }
}
// what I want to do is insert logs into db here
private async void EvenetListener(Object sender, Event e)
{
    var calStatRepo = _service.GetRequiredService<ICalStatRepo>(); //> Error

    await calStatRepo.InsertCallStat(args);
}

Проблема при добавлении требуемой службы в прослушивателе событий приведет к ошибке, как показано ниже:

Не удалось разрешить 'Repositories.ICalStatRepo' от провайдера root, поскольку для него требуется служба с ограниченным доступом Models.Context.DBContext.

DBContext добавляется при запуске как services.AddDbContext и внедряется в CalStatRepo, а затем добавляется в качестве требуемой службы в прослушиватель событий в фоновый сервис, но почему он снова требуется в качестве сервиса с областью действия?

Любая помощь будет оценена.

Ответы [ 2 ]

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

AddDbContext регистрирует DbContext в качестве службы с определенным объемом. Таким образом, вы можете разрешить эту службу только в области.

Таким образом, вам нужно только создать область и утилизировать ее, когда она больше не нужна:

public class BackgroundListener : BackgroundService
{
    private readonly IServiceProvider _service;

    public BackgroundListener(IServiceProvider service)
    {
        _service = service;
    }

    // what I want to do is insert logs into db here
    private async void EvenetListener(Object sender, Event e)
    {
        using ( var scope = _service.CreateScope() )
        {
            var calStatRepo = scope.ServiceProvider.GetRequiredService<ICalStatRepo>();
            await calStatRepo.InsertCallStat(args);
        }
    }
}

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

По умолчанию фоновые службы не имеют созданной области действия. Чтобы разрешить службы с областью действия, такие как DbContext, необходимо создать дочернюю область вне контейнера root.

Посмотрите на как использовать службы с областью действия в фоновых службах .

...