使用 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().