【发布时间】:2011-01-10 20:21:59
【问题描述】:
我正在使用 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>();
【问题讨论】:
-
IoC 不就是使用接口吗???
-
当然,我主要是这样做的。但这对问题没有影响。
-
@Martin 许多程序员使用类并避免创建一个接口然后只有一个实现的虚假通用性。它还避免了您在大多数企业应用程序中看到的大量臭气熏天的 IoC 接线,但仍然允许您在需要时切换一些实现。 programmers.stackexchange.com/questions/133471/…
标签: c# .net unity-container ioc-container