#c# #reflection #dependencies #asp.net-core-hosted-services
Вопрос:
Я пытаюсь зарегистрировать все свои рабочие службы как размещенные службы в dotnet 5.0 с помощью отражения.
Я уже зарегистрировал все службы приложений моего проекта таким образом :
private static void RegisterApplicationServices(IServiceCollection services) { var applicationServices = (Assembly.GetAssembly(typeof(ConfigurationService))) .GetTypes() .Where(x =gt; !x.IsInterface amp;amp; x.GetInterface(typeof(IApplicationService).Name) != null); foreach (var serviceType in applicationServices) { var type = serviceType.UnderlyingSystemType; services.AddTransient(type.GetInterface($"I{type.Name}"), type); } }
Но когда дело доходит до размещенного сервиса, это не работает. Мне нужен какой-то способ зарегистрировать всех работников в качестве размещенных служб.
services.AddHostedServicelt;WokrerService1gt;(); services.AddHostedServicelt;WokrerService2gt;(); services.AddHostedServicelt;WokrerService3gt;(); services.AddHostedServicelt;WokrerService4gt;(); services.AddHostedServicelt;WokrerService5gt;(); services.AddHostedServicelt;WokrerService6gt;(); private static void RegisterHostedServices(IServiceCollection services) { //What should I do here? }
Все работники наследуются от класса базовых работников
public abstract class BaseWorkerServicelt;TWorkerServicegt; : BackgroundService, IAppHostedService where TWorkerService : class { } public class TransactionSubscriberService : BaseWorkerServicelt;TransactionSubscriberServicegt; { }
Я ценю любую помощь.
Ответ №1:
Итак, AddHostedService
просто добавляет синглеты типа IHostedService
и типа реализации. Здесь нет никакой магии:
var types = someAssembly .GetTypes() // or however you want to target classes .Where(t =gt; t.IsSubclassOf(typeof(IHostedService))); foreach (var type in types) services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IHostedService), type));
Однако, похоже , проблема в том, что вы не можете заблокировать StartAsync
, иначе другие службы не запустятся:
public Task StartAsync(CancellationToken cancellationToken) { Task.Run(() =gt; DoSomething); return Task.CompletedTask; }
Отказ от ответственности : я никогда не пробовал этого, код не был протестирован, и это теоретический ответ из краткого обзора исходного кода