2011-03-09 63 views
16

的默認構造我有此類:統一不使用類

public class Repo 
{ 
    public Repo() : this(ConfigurationManager.AppSettings["identity"],  ConfigurationManager.AppSettings["password"]) 

    { 

    } 

    public Repo(string identity,string password) 
    { 
     //Initialize properties. 
    } 

} 

我添加一行的web.config使得該類型將由統一容器被自動構造。

,但我的應用程序的執行過程中,我收到此錯誤信息:

"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)爲什麼不統一使用默認構造函數?

2)假設我想讓Unity使用第二個構造函數(參數化構造函數),我如何 通過配置文件將該信息傳遞給Unity?

回答

49

默認情況下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. 
    } 
} 

這樣做的第二個方法,如果你反對搞亂了類/帶屬性的方法,是指定構造

IUnityContainer container = new UnityContainer(); 
container.RegisterType<Repo>(new InjectionConstructor()); 

documentation

01配置使用 InjectionConstructor你的容器時使用

如何統一解決目標構造函數和參數

當目標類包含一個以上的構造函數,統一將使用 具有應用InjectionConstructor屬性之一。如果 不止一個構造函數,並且沒有一個攜帶了 InjectionConstructor屬性,則Unity將使用帶有最多參數的構造函數 。如果有多個這樣的構造函數(更多 比具有相同參數數量的「最長」之一),Unity 將引發異常。

+0

@IanWarburton如果你解釋你嘗試過什麼,你看到了什麼,我會盡力幫助您解決問題。 – 2013-06-19 20:19:16

+0

嗯,很高興知道!不知怎的,我期望它用LEAST參數調用構造函數......有趣的是 – Jowen 2014-12-11 12:57:31

+0

爲什麼Unity沒有將* default *構造函數作爲其默認*?沒有多少意義,我也沒有多少意義... – talles 2015-11-20 19:55:44

18

只是嘗試這種方式註冊類型:

<register type="IRepo" mapTo="Repo"> 
    <constructor /> 
</register> 

由於constructor元素應該調用默認構造函數沒有指定param元素。

你也可以這樣做登記代碼:

container.RegisterType<IRepo, Repo>(new InjectionConstructor()); 
+0

最佳答案!這解決了這個問題,以前的評論只是解釋了默認行爲。 – charino 2016-04-20 16:22:37