c# - 统一解决同一类型的多个实例

标签 c# unity-container ioc-container

我想对多种类型注册做一个简单的解析(最终构造函数注入(inject),但使用 .Resolve 来查看 Unity 是否有能力做这样的事情。

在下面的每种情况下,Unity 在本应解析 2 个的地方解析了 0 个项目。

Unity 中是否有一些开关会开启 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();

    }
}

最佳答案

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

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

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<IFoo> , 结果将只包含 Foo2 的实例和 Foo3 , 但不会有 Foo1 的实例因为不包括默认注册。

关于c# - 统一解决同一类型的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921008/

相关文章:

c# - 内存中的 System.Drawing.Image 需要 MD5 哈希

c# - Linq to 对象和 lambda 表达式

c# - 模拟服务调用对象返回 null

dependency-injection - Autofac OwnedInstances 和 ASP.NET Web API 的 InstancePerApiRequest 支持

c# - 使用 CaSTLe Windsor IoC 注册通用类型和服务

c# - _Layout.cshtml 的本地化

c# - 编号列表框

dependency-injection - 什么时候使用属性注入(inject)?

c# - 用于动态解析程序集的 Unity IoC

asp.net-mvc - asp.net mvc 4 - 可以为每个线程共享 DbContext 吗?