Внедрение сервисов в метод в ASP.NET Core 2.x - PullRequest
0 голосов
/ 08 декабря 2018

Я ищу информацию о том, как динамически внедрить службы в метод класса с помощью внедрения зависимостей в ASP.Net Core.

Например, в промежуточном программном обеспечении ASP вы можете внедрить любое количество служб вметод Invoke, в отличие от конструктора. В этой документации объясняется, как вы можете внедрить сервисы с областями действия в метод Middeware Invoke:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // IMyScopedService is injected into Invoke
    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
    {
        svc.MyProperty = 1000;
        await _next(httpContext);
    }
}

Я хотел бы повторить то же поведение в своем собственном коде, но не могу найти какой-либоДокументация объясняет, как этого добиться.В настоящее время я создаю область, используя IServiceProvider.CreateScope и передаю полученный IServiceProvider в качестве параметра моей функции, определенной ниже:

public async Task DoWork(IServiceProvider services, CancellationToken cancellationToken)
        {
            var logger = services.GetRequiredService<ILogger<RoomController>>();
            logger.LogInformation("Starting Room Controller.");
            while (!cancellationToken.IsCancellationRequested)
            {

                logger.LogInformation("Room still running");
                Thread.Sleep(5000);
            }
        }

Я бы хотел, чтобы моя функция выглядела примерно так:

public async Task DoWork(CancellationToken cancellationToken, ILogger<RoomController> logger)
        {
            logger.LogInformation("Starting Room Controller.");
            while (!cancellationToken.IsCancellationRequested)
            {

                logger.LogInformation("Room still running");
                Thread.Sleep(5000);
            }
        }

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 28 августа 2019

Мне тоже было любопытно, поэтому я покопался в github, чтобы посмотреть, как это делается для промежуточного программного обеспечения.Оказывается, это в значительной степени ручной процесс:

https://github.com/aspnet/AspNetCore/blob/425c196cba530b161b120a57af8f1dd513b96f67/src/Http/Http.Abstractions/src/Extensions/UseMiddlewareExtensions.cs

(не копировать код здесь, так как это довольно много)

Они проверяют сигнатуру метода и компилируют фабрикуделегат, который извлекает необходимые услуги из IServiceProvider, который находится в HttpContext.

0 голосов
/ 08 декабря 2018

Надежда Внедрение зависимостей в ASP.NET Core может помочь:

  • Регистрация зависимости в контейнере службы.ASP.NET Core предоставляет встроенный сервисный контейнер IServiceProvider.Службы регистрируются в методе Startup.ConfigureServices приложения.

Вам необходимо зарегистрироваться в ConfigureService, как следует разрешить внедрение зависимостей.

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