2012-07-13 50 views
0

我玩類型工廠實現,我一直在閱讀關於類型工廠的城堡頁面。我想知道如何將構造參數傳遞到泛型工廠。MVC DI城堡類型工廠設施與參數

public interface IFacilityFactory { 
    IFacility<T> Create<T>(); // how to pass some parameter(s) to any T constructor? 
} 

您能否給我一些指導?非常感謝你。

+1

你爲什麼要這樣做? – 2012-07-13 21:59:02

+0

謝謝。我想要做這樣的事情var component = factory.CreateComponent(「foo」,3);在打字的工廠頁面上找到它。對不起,我是盲人。 – Tom 2012-07-14 04:00:26

回答

2

它沒有多大意義,因爲您需要爲可用作泛型類型參數'T'的無限可能類型集提供一組公共的構造函數參數。

然而,把意識放在一邊,我相信你可以做到這一點。您只需在工廠界面上聲明參數,即使用Resolve()Windsor將在工廠使用時執行的參數。參數名稱將成爲字典鍵。您不需要聲明將從容器本身解析的構造函數屬性。

E.g.說我們必須在容器和相關的類Foo註冊的成分吧:

public class Foo 
{ 
    // Constructor requires Bar to be resolved from the container 
    public Foo(int something, Bar bar, string somethingElse) 
    { 
     ... 
    } 
} 

我們將宣佈工廠接口:

public interface IGenericFactory 
{ 
    T Create<T>(int something, string somethingElse) 
} 

當我們使用類型化的工廠,溫莎將通過兩個參數解決容器中的其他參數(bar)。 '東西'和'東西埃爾斯'參數只是被推送到一個詞典和溫莎數字,如果它可以使用它們或不。當然,如果您致電Create<Foo>(1, ""),它們將能夠使用它們,但對於除Foo以外的任何類型,它們可能都是多餘的。

+0

謝謝。我必須失明。它在它們的類型化工廠指令頁面上:IComponent CreateComponent(string componentName,int someParameter); var component = factory.CreateComponent(「foo」,3); 直接等價於調用: var component = kernel.Resolve (new Dictionary {{「componentName」,「foo」},{「someParameter」,3}}); – Tom 2012-07-14 03:57:14