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

sti*_*k81 42 .net c# ioc-container unity-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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然失败了,因为它无法创建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());
Run Code Online (Sandbox Code Playgroud)

并解决:

var person = Container.Resolve<Person>();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 50

请将此注册为:

container.RegisterType<Person>(new InjectionConstructor());
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您不想为类的依赖项传递手动对象,而是希望Unity注入已经存在的对象,则还可以执行new InjectionConstructor(typeof(IMyDependency),typeof(IMySecondDependency)))以指定具有依赖项的构造函数。注册类型 (2认同)

Ant*_*lev 27

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

  • 我们应该提到,装饰构造函数将组件耦合到Unity作为其IoC容器.在注册期间处理规范可能更可取,因此组件不需要引用Unity,因此如果需要可以替换不同的IoC. (6认同)