Как зарегистрировать все размещенные службы с отражением в dotnet 5.0

#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; }  

Отказ от ответственности : я никогда не пробовал этого, код не был протестирован, и это теоретический ответ из краткого обзора исходного кода