指定要使用的Unity IoC容器的构造函数

时间:2010-01-29 13:05:01

标签: c# .net unity-container ioc-container

我正在使用Unity IoC容器来解析我的对象。但是,我遇到了一个问题。当我有多个构造函数时 - Unity如何知道使用哪一个?当我有一个和一个没有时,它似乎使用带参数的那个。我可以明确告诉它使用哪个构造函数吗?

具体来说,我有一个类似于以下带有两个构造函数的Person类的情况。在这种情况下,我希望IoC容器使用默认构造函数 - 没有参数 - 但它选择带参数的容器。

public class SomeValueObject
{
    public SomeValueObject(string name)
    {
        Name = name; 
    }
    public string Name { get; set; }
}

public class Person
{
    private string _name; 

    public Person()
    {
        _name = string.Empty;
    }

    public Person(SomeValueObject obj)
    {
        _name = obj.Name;
    }
}

这显然失败了,因为它无法创建SomeValueObject - 不知道要向其字符串参数注入什么。它给出的错误是:

  

依赖项的解析失败,type =“MyApp.Person”,name =“”。异常消息是:当前构建操作(构建密钥Build Key [MyApp.Person,null])失败:尝试调用构造函数MyApp.Person(MyApp.SomeValueObject obj)时无法解析参数obj。 (策略类型BuildPlanStrategy,索引3)

容器注册:

Container.RegisterType<Person, Person>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());

解决:

var person = Container.Resolve<Person>();

4 个答案:

答案 0 :(得分:48)

将其注册为:

container.RegisterType<Person>(new InjectionConstructor());

您也可以使用RegisterType方法的重载添加LifetimeManager。

也就是说,在为DI建模时,如果你有明确的构造函数(即没有重载的构造函数),你的生活会更容易。

答案 1 :(得分:27)

默认情况下,Unity选择具有最大参数数量的构造函数。要覆盖它,请使用InjectionConstructorAttribute装饰所需的构造函数。

答案 2 :(得分:4)

Multiple-Constructor Injection Using an Attribute

  

当目标类包含多个时   一个具有相同编号的构造函数   参数,你必须申请    InjectionConstructor属性到   Unity容器的构造函数   将用于指示哪个构造函数   容器应该使用。和。一样   自动构造函数注入,你   可以指定构造函数参数   作为具体类型,或者您可以指定   一个接口或基类   Unity容器包含一个   注册地图。

答案 3 :(得分:-1)

我必须指出你在这种情况下使用依赖注入的方式是错误的。容器应该能够在构造上注入SomeValueObject。

您最有可能做的是注册SomeValueObject的默认对象,而.Name属性返回string.Empty