我有这堂课:
public class Repo
{
public Repo() : this(ConfigurationManager.AppSettings["identity"], ConfigurationManager.AppSettings["password"])
{
}
public Repo(string identity,string password)
{
//Initialize properties.
}
}
我在web.config中添加了一行,以便Unity容器自动构建此类型。
但在执行我的应用程序期间,我收到以下错误消息:
"System.InvalidOperationException : the parameter identity could not be resolved when attempting to call constructor Repo(String identity, String password) -->Microsoft.Practices.ObjectBuilder2.BuildFailedException : The current Build operation ...."
1)为什么Unity不使用默认构造函数?
2)假设我希望Unity使用第二个构造函数(参数构造函数),我该怎么做 通过配置文件将该信息传递给Unity?
答案 0 :(得分:55)
Unity默认选择具有最多参数的构造函数。你必须告诉Unity明确地使用另一个。
执行此操作的一种方法是使用[InjectionConstructor]属性,如下所示:
using Microsoft.Practices.Unity;
public class Repo
{
[InjectionConstructor]
public Repo() : this(ConfigurationManager.AppSettings["identity"], ConfigurationManager.AppSettings["password"])
{
}
public Repo(string identity,string password)
{
//Initialize properties.
}
}
如果您反对使用属性来混淆类/方法,那么第二种方法是指定在使用InjectionConstructor配置容器时使用哪个构造函数:
IUnityContainer container = new UnityContainer();
container.RegisterType<Repo>(new InjectionConstructor());
Unity如何解析目标构造函数和参数
当目标类包含多个构造函数时,Unity将使用 应用了InjectionConstructor属性的那个。如果有 是不止一个构造函数,没有一个构造函数 在InjectionConstructor属性中,Unity将使用构造函数 最多的参数。如果有多个这样的构造函数(更多 Unity,比具有相同参数数量的“最长”之一 会引发例外。
答案 1 :(得分:21)
尝试以这种方式注册类型:
<register type="IRepo" mapTo="Repo">
<constructor />
</register>
由于param
元素中没有指定constructor
元素,因此它应该调用默认构造函数。
您也可以在代码中进行注册:
container.RegisterType<IRepo, Repo>(new InjectionConstructor());
答案 2 :(得分:0)
我有一个更简单的问题导致了此错误。
我使用的容器是错误的容器。我不小心创建了两个不同的容器,并且我的 container.RegisterType