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



我不知道如何使用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()

相关内容

  • 没有找到相关文章

最新更新