Разве невозможно добавить класс с помощью IServiceCollection :: AddHostedService ()? - PullRequest
0 голосов
/ 06 октября 2019

Я создал проект MVC по умолчанию для ASP.NET Core Web Application. Затем я добавил это.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddHostedService<MyService>(); //<-- What I added.
    }

MyService - это фиктивный класс, который реализует IHostedService

public class MyService : IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        Debug.WriteLine("Hello world");
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        Debug.WriteLine("Goodbye world");
        return Task.CompletedTask;
    }
}

Теперь, в HomeController, я попробовал следующие две вещичтобы получить экземпляр MyService, но оба вызвали не найденные или нулевые исключения.

    public IActionResult Index([FromServices] MyService ms)
    {

    public IActionResult Index([FromServices] IServiceProvider sp)
    {
        var ms = sp.GetService(typeof(MyService));

Разве невозможно получить его? Все вышеописанные изменения - это все, что я сделал для стандартных лесов, но если вам нужно просмотреть полный исходный код, я загрузил его в этот репозиторий Git .

1 Ответ

1 голос
/ 06 октября 2019

Почему вы хотите внедрить ваш IHostedService в ваш контроллер? Кажется действительно странным для меня.

Во всяком случае, AddHostedService регистрирует реализацию как переходную, как это можно увидеть здесь ...

public static IServiceCollection AddHostedService<THostedService>(this IServiceCollection services)
        where THostedService : class, IHostedService
        => services.AddTransient<IHostedService, THostedService>();
}

... так что следующее должно"работа"

services.AddTransient<MyService>();
services.AddTransient<IHostedService>(x => return x.GetRequiredService<MyService>());

Единственная проблема с этим заключается в том, что вы будете получать новый свежий экземпляр вашего сервиса каждый раз, когда вы вводите / разрешаете его, и я не думаю, что это то, что вы хотите.

Итак, почему вы хотите это сделать, какую проблему вы пытаетесь решить?

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