如何为IBackgroundJob的每个实现自动注册对应泛型处理器与启停动作?
你当前的反射遍历注册方案已经是这类场景下的标准实现,Autofac 并没有原生内置专门支持「级联注册两层关联泛型类型」的语法糖,你的写法已经可以稳定满足需求,没有问题。
如果想要简化代码,可以利用 Autofac 自带的程序集扫描注册回调优化写法,逻辑完全等价:
public static void AddBackgroundJobs(this ContainerBuilder self, Assembly assembly) { // 扫描注册所有IBackgroundJob实现 self.RegisterAssemblyTypes(assembly) .Where(t => t.IsAssignableTo<IBackgroundJob>() && !t.IsAbstract) .AsImplementedInterfaces() .AsSelf() .SingleInstance() // 每个Job注册完成后自动关联注册处理器和启停动作 .OnRegistered(regArgs => { var jobType = regArgs.ComponentRegistration.Activator.LimitType; var processorType = typeof(BackgroundProcessor<>).MakeGenericType(jobType); var actionType = typeof(BackgroundProcessorStartupShutdownAction<>).MakeGenericType(processorType); self.RegisterType(processorType) .AsImplementedInterfaces() .AsSelf() .SingleInstance(); self.RegisterType(actionType) .AsImplementedInterfaces() .AsSelf() .SingleInstance(); }); }
有两个可以注意的细节:
- 如果你的Job实现存在多个构造函数,建议在注册时增加
UsingConstructor(参数类型列表)显式指定构造函数,避免自动匹配注入参数出错 - 你原有实现中把三个类型放在同一个
RegisterTypes方法中注册是完全合法的,只要三者生命周期要求一致,两种写法的性能和最终效果没有任何差异
如果后续要迁移到微软原生DI容器,逻辑和你现在的写法完全一致,都是通过反射遍历Job实现构造泛型类型注册,这类业务定制化的级联注册场景,框架本身都不会提供内置的简化语法。
内容的提问来源于stack exchange,提问作者Modern Ronin
相关产品推荐
相关产品推荐

