[英]Specify constructor for the Unity IoC container to use
我正在使用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>();
请将此注册为:
container.RegisterType<Person>(new InjectionConstructor());
您也可以使用RegisterType方法的重载添加LifetimeManager。
也就是说,在为DI建模时,如果你有明确的构造函数(即没有重载的构造函数),你的生活会更容易。
默认情况下,Unity选择具有最大参数数量的构造函数。 要覆盖它,请使用InjectionConstructorAttribute修饰所需的构造函数。
当目标类包含多个具有相同参数数量的构造函数时,必须将InjectionConstructor属性应用于Unity容器将用于指示容器应使用的构造函数的构造函数。 与自动构造函数注入一样,您可以将构造函数参数指定为具体类型,也可以指定Unity容器包含已注册映射的接口或基类。
我必须指出你在这种情况下使用依赖注入的方式是错误的。 容器应该能够在构造上注入SomeValueObject。
你最有可能做的是注册SomeValueObject的默认对象,而.Name属性返回string.Empty
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.