Unity不使用类的默认构造函数

时间:2011-03-09 22:38:01

标签: c# .net inversion-of-control unity-container

我有这堂课:

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?

3 个答案:

答案 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());

来自documentation

  

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 处于所使用容器的另一个容器内。