我有一个带有单个后台服务 (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()>();
}
});
@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();