類別建構子有時會因為需求的關係,提供具有參數的建構子,在使用Unity 時該如何提供建構子參數呢?或著是說當我的實作類別是具有參數的建構子時,該如何設定Unity ?
在前一篇談如何在Unity設定assembly時,有談到如何設定基本的Unity設定檔,當時的設定都是面對一般預設無參數建構子的實作類別,一旦面對的實作類別是具有參數的建構子時,當程式進行Resolve解析時會發生以下錯誤情況
首先如果你是在程式內動態註冊型別時,那麼你可以在註冊型別的程式碼上加入InjectionConstructor,如下所示,ICustomize是要註冊進去的介面,而InjectionConstructor("xxxx")則是為實作類別的建構子參數提供注入參數值。
IUnityContainer container = new UnityContainer();
container.RegisterType<ICustomize>(new InjectionConstructor("xxxx"));
但如果你是使用Unity設定檔的方式來為系統註冊型別時,那麼則需在註冊檔裡加入constructor param的設定,如下所示,其中name="node"的node是對映建構子的參數名稱,而value則顧名思議就參數值,假設如果參數不只一個,那麼就是在constructor 節點內,加入多組的param設定去map到建構子的參數即可。
<register type="Mylibrary.ILeaveCustomize,Mylibrary" mapTo="Acct.Customize.Leave, Acct.Customize>
<constructor>
<param name="node" value="xxxx" />
</constructor>
</register>
透過上述二種方式的手法,就可以很輕鬆簡單的為實作類別提供Constructor Injection的機制囉。
若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。
By No.18