gpt4 book ai didi

c# - 当需要多个相同类型的实例时使用 Unity 进行 DI

转载 作者:太空狗 更新时间:2023-10-29 17:37:59 25 4
gpt4 key购买 nike

我需要这方面的帮助。我使用 Unity 作为我的容器,我想将相同类型的两个不同实例注入(inject)到我的构造函数中。

class Example
{
Example(IQueue receiveQueue, IQueue sendQueue) {}
}

....并且 IQueue 在我的 MessageQueue 类中实现....

class MessageQueue : IQueue
{
MessageQueue(string path) {}
}

如何将两个不同的 MessageQueue 实例注入(inject)到我的 Example 类中?要使用不同路径创建的每个 MessageQueue 实例。

最佳答案

有很多方法可以达到您想要的结果(如多个答案所证明)。这是另一种使用命名注册的方法(没有属性):

IUnityContainer container = new UnityContainer();

container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));

container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));

container.RegisterType<Example>(
new InjectionConstructor(
new ResolvedParameter<IQueue>("ReceiveQueue"),
new ResolvedParameter<IQueue>("SendQueue")));

Example example = container.Resolve<Example>();

这种方法的缺点是,如果更改了 Example 构造函数,则也必须修改注册代码以匹配。此外,该错误将是运行时错误,而不是更可取的编译时错误。

您可以将上述内容与 InjectionFactory 结合起来,手动调用构造函数以进行编译时检查:

IUnityContainer container = new UnityContainer();

container.RegisterType<IQueue, MessageQueue>("ReceiveQueue",
new InjectionConstructor("receivePath"));

container.RegisterType<IQueue, MessageQueue>("SendQueue",
new InjectionConstructor("sendPath"));

container.RegisterType<Example>(new InjectionFactory(c =>
new Example(c.Resolve<IQueue>("ReceiveQueue"),
c.Resolve<IQueue>("SendQueue"))));

Example example = container.Resolve<Example>();

如果您使用组合根,那么魔术字符串(“ReceiveQueue”和“SendQueue”)的使用将仅限于一个注册位置。

关于c# - 当需要多个相同类型的实例时使用 Unity 进行 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18457741/

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