AddHostedService 用于从动态加载的程序集加载的类型

问题描述 投票:0回答:2

我有一个带有单个后台服务 (MyInternalBackgroundService) 的 .NET 5 后台工作应用程序。

现在我正在研究模块化插件架构,其中插件被放置在插件目录中,从那里加载程序集。每个程序集可以包含多个继承自BackgroundService 的类定义。我加载从 BackgroundService 继承的类型列表。

我只是不知道如何为加载的类型调用 AddHostedService 方法。每种方法似乎都会导致不同的编译器错误。

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)            
    .ConfigureServices((hostContext, services) =>
    {
      services.AddHostedService<MyInternalBackgroundServiceImplementation>();

      TypeInfo[] moduleTypes = // class scanning directories for dlls, load the assemblies and find the desired types
      foreach(var moduleType in moduleTypes)
      {
        // can't find the correct way
        // services.AddHostedService<moduleType>();
        //services.AddHostedService<moduleType.GetType()>();
      }
    });
c# reflection .net-5
2个回答
5
投票

内部

AddHostedService
看起来像这样enter image description here

进一步

AddTransient
看起来像这样enter image description here

所以你可以尝试下面的方法(当然只要

TypeInfoObjectHere
实现了
IHostedService
services.AddTransient(typeof(IHostedService), TypeInfoObjectHere);


0
投票

@maxim 的回答对我有帮助。我最终创建了这个扩展类来自动加载从基类

ProcessorBase
派生的所有服务。分享一下,如果有帮助的话

public static class ServiceCollectionExtensions
{        
    public static IServiceCollection AddJobProcessors(this IServiceCollection services, Assembly assembly = null)
    {
        assembly ??= Assembly.GetCallingAssembly();

        var processorTypes = assembly.GetTypes()
            .Where(t => t.IsClass
                && !t.IsAbstract
                && t.BaseType != null
                && t.BaseType.IsGenericType
                && t.BaseType.GetGenericTypeDefinition() == typeof(ProcessorBase<>));

        foreach (var processor in processorTypes)            
            services.AddTransient(typeof(IHostedService), processor);            

        return services;
    }
}    

用途:

services.AddJobProcessors();
© www.soinside.com 2019 - 2024. All rights reserved.