使用 LightInject 注册所有实现通用接口的 类
Using LightInject to register all classes that implement a generic interface
我不知道如何使用 LightInject 的 API 来注册给定 class 中定义的所有处理程序。在这种情况下,使用 LightInject 适配器为 Rebus 定义处理程序。
所以给定一个处理程序定义为:
public class MyHandler : IHandleMessages<MyMessage>
{
}
我以为我可以在程序集中注册如下:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
但是当我尝试注册该类型的实例时,找不到它们(container.AvailableServices 显示类型但值 属性 为空)
var detectedHandlers = container.GetAllInstances<IHandleMessages<MyMessage>>();
有效的是手动定义如下:
container.Register<IHandleMessages<MyMessage>, MyHandler>();
但这并不理想,因为它需要手动注册。有没有办法用 LightInject 做到这一点?
您的注册将不起作用,因为非通用类型,例如 MyHandler
从不 实现开放通用抽象,例如 IHandleMessages<>
.相反,您应该检查 MyHandler
是否实现了 closed 版本的 IHandleMessages<>
:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));
请注意,之前的注册通过使用 s
服务类型参数进一步简化了注册,这样您就不必调用 .GetInterfaces()
.
我不知道如何使用 LightInject 的 API 来注册给定 class 中定义的所有处理程序。在这种情况下,使用 LightInject 适配器为 Rebus 定义处理程序。
所以给定一个处理程序定义为:
public class MyHandler : IHandleMessages<MyMessage>
{
}
我以为我可以在程序集中注册如下:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
但是当我尝试注册该类型的实例时,找不到它们(container.AvailableServices 显示类型但值 属性 为空)
var detectedHandlers = container.GetAllInstances<IHandleMessages<MyMessage>>();
有效的是手动定义如下:
container.Register<IHandleMessages<MyMessage>, MyHandler>();
但这并不理想,因为它需要手动注册。有没有办法用 LightInject 做到这一点?
您的注册将不起作用,因为非通用类型,例如 MyHandler
从不 实现开放通用抽象,例如 IHandleMessages<>
.相反,您应该检查 MyHandler
是否实现了 closed 版本的 IHandleMessages<>
:
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s, _) => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(IHandleMessages<>));
请注意,之前的注册通过使用 s
服务类型参数进一步简化了注册,这样您就不必调用 .GetInterfaces()
.