【问题标题】:Getting unity to resolve multiple instances of the same type统一解决同一类型的多个实例
【发布时间】:2013-06-04 14:53:55
【问题描述】:

我想对多个类型注册做一个简单的解析(最终注入了构造函数,但使用 .Resolve 来查看 Unity 是否甚至能够处理这些事情。

在以下每种情况下,Unity 解决了 0 个项目,而它应该解决 2 个项目。

是否有一些统一的开关可以开启 2007 年后的行为?还是我只是严重遗漏了什么?

这是我的代码:

public interface IFoo {}
public class Foo1 : IFoo{}
public class Foo2 : IFoo{}

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

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

        var foos = container.Resolve<IFoo[]>();
        Console.WriteLine(foos.Count());

        Console.ReadLine();

    }
}

【问题讨论】:

  • 这是截至今天在 Nuget 上使用最新的 Unity 包。

标签: c# unity-container ioc-container


【解决方案1】:

在 Unity 中只能有一个默认注册(在 container.RegisterType<IFoo, Foo1>(); 中没有名称的注册)。如果执行多个默认注册,则最后一个获胜。

为了为同一个接口注册多个实现,您需要为这些注册分配名称:

container.RegisterType<IFoo, Foo1>("registration1");
container.RegisterType<IFoo, Foo2>("registration2");

另外,Unity 默认只理解数组。如果您想解析为数组,那么您可以使用默认行为。否则,您将需要在数组和您感兴趣的集合之间注册一个映射,例如:

container.RegisterType<IEnumerable<IFoo>, IFoo[]>();

另一个重要的注意事项是解析集合时不会返回默认注册。 例如给出:

container.RegisterType<IFoo, Foo1>();
container.RegisterType<IFoo, Foo2>("registration1");
container.RegisterType<IFoo, Foo3>("registration2");
container.RegisterType<IEnumerable<IFoo>, IFoo[]>();

如果解析IEnumerable&lt;IFoo&gt;,结果将只包含Foo2Foo3的实例,但不会有Foo1的实例,因为不包括默认注册。

【讨论】:

  • 在 MVC 应用程序中,可以在任何我想要的地方执行 var container = new UnityContainer();container.Resolve() 吗?还是有更好的方法?
  • @Narayana 您应该将其保留在应用程序中称为组合根的单个位置。在 MVC 中,您通常有某种引导程序来创建容器并将其与自定义 DependencyResolverControllerFactory 一起使用。你的其余代码应该只通过构造函数/依赖注入来声明它的依赖。看看this article
  • 不会恢复默认注册,恕我直言,这有点奇怪。生活和学习。
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多