Размещенная служба .NET Core

Мне нужно получить ссылку на зарегистрированную размещенную службу:

services.AddHostedService<DataCollectingService>();

Он реализует интерфейс IHostedService и правильно запускается при запуске веб-приложения.

Мне нужно получить ссылку на службу в каком-то контроллере и получить доступ к публичным членам объекта.

Следующий код не работает. xService равно нулю.

public IActionResult T()
{
    using (var serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
    {
        var xService = serviceScope.ServiceProvider.GetService<DataCollectingService>();

    }
    return RedirectToAction(nameof(Index));
}

person Jaroslav Langer    schedule 10.06.2019    source источник
comment
Почему бы не попросить другую службу для передачи информации между вашим контроллером и размещенной службой? Какой-то кеширующий слой.   -  person gunr2171    schedule 10.06.2019
comment
Это мой план резервного копирования - использовать какое-то статическое свойство, которое будет заполнено сервисом после его запуска. Но я думаю, что есть более правильный способ получить ссылку.   -  person Jaroslav Langer    schedule 10.06.2019
comment
Итак, согласно исходному коду элемент зарегистрирован как IHostedService. Вы должны иметь возможность запросить IEnumerable<IHostedService> в конструкторе вашего контроллера. Но я не думаю, что вы можете запросить размещенную службу напрямую по имени.   -  person gunr2171    schedule 10.06.2019
comment
Ну, вы также создаете новую область в своем коде, поэтому тогда ваша фоновая служба сразу же выходит за рамки.   -  person Vidmantas Blazevicius    schedule 10.06.2019
comment
IEnumerable‹IHostedService› в конструкторе контроллера не работает. Он создает новый экземпляр, но мне нужна ссылка на источник.   -  person Jaroslav Langer    schedule 10.06.2019
comment
Возможный дубликат Как получить ссылку на IHostedService через внедрение зависимостей в ASP.NET Core?   -  person mclark1129    schedule 11.06.2019
comment
Кто-нибудь развернул .NET Core Hosted Service на сервере IIS?   -  person Adrita Sharma    schedule 14.08.2019


Ответы (3)


Ответ, который работает в .Net Core 3.1+, был дан gunr2171 в 3-й комментарий исходного вопроса:

IEnumerable<IHostedService> allHostedServices = this.serviceProvider.GetService<IEnumerable<IHostedService>>();

Возвращает ссылки на существующие экземпляры Hosted Services.

person Hursev    schedule 14.05.2021

Я временно обработал это, статически сохранив ссылку в классе, который установлен во время запуска.

person Jaroslav Langer    schedule 10.06.2019

Я бы переместил всю функциональность в синглтон, а затем в своем стартапе сделал бы что-то вроде

services.AddSingleton<DataCollectingService>();
services.AddHostedService<HostedServiceUsingTheDataCollectionService>();

Затем я мог бы внедрить синглтон в контроллеры.

Я не уверен, что Core будет обрабатывать ту же ссылку (я думаю, что в ядре 3 будет так, но не уверен в ‹=2.2), но я бы попробовал.

person rekiem87    schedule 10.06.2019