C# 获取unity以解析同一类型的多个实例

C# 获取unity以解析同一类型的多个实例,c#,unity-container,ioc-container,C#,Unity Container,Ioc Container,我想简单地解析多类型注册(最终是构造函数注入,但使用.resolve),看看Unity是否能够实现这些功能 在下面的每种情况下,Unity都会解析0项,而它应该解析2项 在团结中是否有某种转变开启了2007年后的行为?还是我完全错过了什么 这是我的密码: public interface IFoo {} public class Foo1 : IFoo{} public class Foo2 : IFoo{} class Program { static void Main(strin

我想简单地解析多类型注册(最终是构造函数注入,但使用.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();

    }
}
公共接口IFoo{}
公共类Foo1:IFoo{}
公共类Foo2:IFoo{}
班级计划
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
container.RegisterType();
container.RegisterType();
//container.Resolve();返回0
//container.ResolveAll();返回0
var foos=container.Resolve();
Console.WriteLine(foos.Count());
Console.ReadLine();
}
}

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

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

container.RegisterType<IFoo, Foo1>("registration1");
container.RegisterType<IFoo, Foo2>("registration2");
container.RegisterType(“registration1”);
容器注册类型(“注册2”);
此外,Unity默认情况下只理解数组。如果您希望解析为数组,则可以使用默认行为。否则,您需要注册数组与感兴趣的集合之间的映射,如:

container.RegisterType<IEnumerable<IFoo>, IFoo[]>();
container.RegisterType();
另一个重要注意事项是,解析集合时不会返回默认注册。 例如:

container.RegisterType<IFoo, Foo1>();
container.RegisterType<IFoo, Foo2>("registration1");
container.RegisterType<IFoo, Foo3>("registration2");
container.RegisterType<IEnumerable<IFoo>, IFoo[]>();
container.RegisterType();
容器。注册表类型(“注册表1”);
容器注册类型(“注册2”);
container.RegisterType();

如果您解析
IEnumerable
,结果将只包含
Foo2
Foo3
的实例,但不会有
Foo1
的实例,因为默认注册不包括在内。

这是从今天开始在Nuget上使用的最新Unity软件包。在MVC应用程序中,可以执行
var container=n吗ew UnityContainer();
容器.Resolve()
在我想要的地方?或者有更好的方法吗?@Narayana你应该把它放在应用程序中的一个地方,称为compositionroot。在MVC中,你通常有一种引导程序来创建容器,并将其与自定义的
依赖解析程序
控制器工厂
一起使用。剩下的代码应该只通过构造函数/依赖项注入声明其依赖项。请看一下。不会返回默认注册,即tad-wird-imho.live and-learn。