我不知道如何使用LightInject的API注册给定类中定义的所有处理程序。在这种情况下,使用LightInject Adapter定义用于重组的处理程序。
因此,给定一个处理程序定义为:
public class MyHandler : IHandleMessages<MyMessage>
{
}
我认为我可以在大会上注册全部如下:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
但是当我尝试获取未找到该类型的实例时
var detectedHandlers = container.GetAllInstances<IHandleMessages<MyMessage>>();
有效的工作是手动定义它如下:
container.Register<IHandleMessages<MyMessage>, MyHandler>();
这不是理想的,因为它需要手动注册。有没有一种方法可以使用LightInject?
您的注册将不起作用,因为非传播类型(例如MyHandler
DO Never> Never (实现了开放的基因抽象,例如IHandleMessages<>
。相反,您应该检查MyHandler
是否实现了IHandleMessages<>
的封闭版本:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));
请注意,以前的注册通过使用s
服务类型参数进一步简化了注册,这可以使您不必致电.GetInterfaces()
。