gpt4 book ai didi

c# - 使用 LightInject 注册所有实现通用接口(interface)的类

转载 作者:行者123 更新时间:2023-11-30 23:05:29 28 4
gpt4 key购买 nike

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

因此给定一个处理程序定义为:

public class MyHandler : IHandleMessages<MyMessage>
{
}

我以为我可以在程序集中注册如下:

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

但是当我尝试注册该类型的实例时,找不到它们(container.AvailableServices 显示类型但 value 属性为空)

var detectedHandlers = container.GetAllInstances<IHandleMessages<MyMessage>>();

有效的方法是按如下方式手动定义它:

container.Register<IHandleMessages<MyMessage>, MyHandler>();

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

最佳答案

您的注册将不起作用,因为非通用类型,例如 MyHandler 永远不要实现开放通用抽象,例如IHandleMessages<> .相反,您应该检查是否 MyHandler实现 IHandleMessages<>封闭版本:

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

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

关于c# - 使用 LightInject 注册所有实现通用接口(interface)的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48780797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com