C# 使用LightInject注册实现泛型接口的所有类

C# 使用LightInject注册实现泛型接口的所有类,c#,dependency-injection,inversion-of-control,rebus,light-inject,C#,Dependency Injection,Inversion Of Control,Rebus,Light Inject,我不知道如何使用LightInject的API注册给定类中定义的所有处理程序。在本例中,使用LightInject适配器为Rebus定义处理程序 因此,给定一个定义为: public class MyHandler : IHandleMessages<MyMessage> { } 公共类MyHandler:IHandleMessages { } 我想我可以在大会上登记如下: container.RegisterAssembly(typeof(HandlerBase).Assemb

我不知道如何使用LightInject的API注册给定类中定义的所有处理程序。在本例中,使用LightInject适配器为Rebus定义处理程序

因此,给定一个定义为:

public class MyHandler : IHandleMessages<MyMessage>
{
}
公共类MyHandler:IHandleMessages
{
}
我想我可以在大会上登记如下:

container.RegisterAssembly(typeof(HandlerBase).Assembly,
    (s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
container.Register<IHandleMessages<MyMessage>, MyHandler>();
container.RegisterAssembly(typeof(HandlerBase).Assembly,
(s,Type)=>Type.GetInterfaces()包含(typeof(IHandleMessages));
但当我尝试注册该类型的实例时,却找不到它们(container.AvailableServices显示该类型,但value属性为null)

var detectedHandlers=container.GetAllInstances();
有效的方法是手动定义它,如下所示:

container.RegisterAssembly(typeof(HandlerBase).Assembly,
    (s, Type) => Type.GetInterfaces().Contains(typeof(IHandleMessages<>)));
container.Register<IHandleMessages<MyMessage>, MyHandler>();
container.Register();

但这并不理想,因为它需要手动注册。有没有办法用LightInject实现这一点?

您的注册将不起作用,因为非泛型类型,如
MyHandler
永远不会实现开放的泛型抽象,如
IHandleMessages
。相反,您应该检查
MyHandler
是否实现了
IHandleMessages
的封闭版本:

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

请注意,前面的注册通过使用
s
服务类型参数进一步简化了注册,这使您不必调用
.GetInterfaces()

container.Count显示了什么?我认为Contains(typeof(IHandleMessages))应该是Contains(typeof(IHandleMessages))如果您指的是ServiceContainer.AvailableServices.Count(),它将显示27个条目。但是,每个条目都有一个.Value=null,这意味着它无法创建映射到该类型的实例。Contains(typeof(IHandleMessages))应该正确,否则它将只注册一个类型,而不是所有实现该接口的类。不管怎样,结果都是一样的。这个URL建议在ServiceContainer中禁用EnableVariance,我用它做了实验,但没有任何运气。我知道LightInject不知道如何将具体的处理程序类与我请求的接口关联的类型相关联。我对以这种方式使用StructureMap没有问题,也许这是处理IoC库的REBS适配器的更多细节。不幸的是,Rebus在将LightInject用作IoC框架方面没有提供这样的示例或帮助,正如well所说的那样——这太完美了!确认这对Rebus有效。我以为我在另一篇SO帖子的基础上尝试了一些非常相似的东西,但这是有点不同和功能性的!