【问题标题】:Unity to resolve multiple implementation of the same interfaceunity解决同一个接口的多个实现
【发布时间】:2026-02-02 06:20:03
【问题描述】:

正如另一个问题Getting unity to resolve multiple instances of the same type中给出的那样

我已经按如下方式初始化了统一容器。

  static void Main(string[] args)
        {
            var container = new UnityContainer();
            container.RegisterType<IFoo, Foo1>("aaa");
            container.RegisterType<IFoo, Foo2>("bbb");

            // container.Resolve<IEnumerable<IFoo>>();   returns 0
            // container.ResolveAll<IFoo>(); returns 0

            Console.WriteLine(foos.Count());

            Console.ReadLine();

        }

当unity初始化下面的类时,它会发送一个包含两个元素的数组。但是这两个元素来自同一个类 Foo1。我不想重复。我需要注入 IFoo 的所有不同实现。

  public class Test
        {
            IFoo[] _fooSet;
            public Test(IFoo[] allRegisteredInterfaces)
            {
                _fooSet = allRegisteredInterfaces;
            }

        }

例如解决方案 Injecting arrays with Unity 不起作用,因为它在注入的数组中创建了重复项。

如何做到这一点?另请注意,我不想注册实例实现。我可以通过注册每个 IFoo 实现实例的数组来轻松做到这一点。例如,以下解决方案无效,因为它注册的是实例而不是类型。

  container.RegisterInstance<IFoo[]>(new IFood[] {
                container.Resolve<Foo1>(),
                container.Resolve<Foo2>()
            });

【问题讨论】:

  • 我无法重现您描述的问题。见here。我看到两个实例已解决,每个已注册类型一个。
  • 我所做的是创建了一个黑色的控制台应用程序并尝试过,它就像你提到的那样工作。这导致我对代码库进行了更多调查,并发现了错误的生命周期管理器。

标签: c# unity-container ioc-container


【解决方案1】:

我终于找到了答案。原来有一个自定义的生命周期管理器,并且编码错误。 我首先创建了一个黑色控制台应用程序并尝试了统一代码示例并且它工作。这导致了原始代码库错误的结论。

【讨论】:

    最近更新 更多