使用LightInject注册实现通用接口的所有类

时间:2018-02-14 06:16:37

标签: c# dependency-injection inversion-of-control rebus light-inject

我无法弄清楚如何使用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做到这一点?

1 个答案:

答案 0 :(得分:2)

您的注册将无法正常工作,因为非通用类型(例如MyHandler 永远不会实现开放式通用抽象,例如IHandleMessages<>。相反,您应该检查MyHandler是否实现了IHandleMessages<>已关闭版本:

container.RegisterAssembly(typeof(HandlerBase).Assembly,
   (s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));

请注意,之前的注册使用s服务类型参数进一步简化了注册,这使您无需致电.GetInterfaces()