我不知道如何使用 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 来做到这一点?
最佳答案
您的注册将不起作用,因为非泛型类型,例如 MyHandler
永远不要实现开放通用抽象,例如 IHandleMessages<>
。相反,您应该检查是否 MyHandler
实现 IHandleMessages<>
的封闭版本:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));
请注意,之前的注册通过使用s
进一步简化了注册。服务类型参数,这使您不必调用 .GetInterfaces()
.
关于c# - 使用 LightInject 注册所有实现通用接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48780797/