我无法弄清楚如何使用LightInject的API来注册在给定类中定义的所有处理程序。在这种情况下,使用LightInject适配器为Rebus定义处理程序。
所以给定一个定义为:
的处理程序public class MyHandler : IHandleMessages<MyMessage>
{
}
我以为我可以在程序集中注册所有内容如下:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
但是当我尝试获取该类型的实例时,找不到它们(container.AvailableServices显示类型,但value属性为null)
var detectedHandlers = container.GetAllInstances<IHandleMessages<MyMessage>>();
工作原理是手动定义如下:
container.Register<IHandleMessages<MyMessage>, MyHandler>();
但这并不理想,因为它需要手动注册。有没有办法用LightInject做到这一点?
答案 0 :(得分:2)
您的注册将无法正常工作,因为非通用类型(例如MyHandler
永远不会实现开放式通用抽象,例如IHandleMessages<>
。相反,您应该检查MyHandler
是否实现了IHandleMessages<>
的已关闭版本:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));
请注意,之前的注册使用s
服务类型参数进一步简化了注册,这使您无需致电.GetInterfaces()
。