2010-09-14 80 views
3
構造函數的參數類的實例

我有以下類別:創建需要與StructureMap

public class AllowanceManager : IAllowanceManager 
{ 
    public AllowanceManager(ITranslationManager t_Manager, ISessionManager s_Manager) 
    {...} 
} 

public class TranslationManager : ITranslationManager 
{ 
    public TranslationManager(string culture) 
    {...} 
} 

public class SessionManager : ISessionManager 
{ 
    public SessionManager(string key) 
    {...} 
} 

我怎樣才能在ObjectFactory的初始化這個班了,這樣讓IAllowanceManager也autowires和初始化實例(帶構造函數參數)StateManager和TranslationManager。所以我只需要像這樣檢索IAllowanceDeduction的實例:

IAllowanceManager a_Manager = ObjectFactory....// Gets Allowancemanager configured with initialized instances of IStateManager and ITranslationManager 

回答

1

編輯:更短。

把這個在你的引導程序代碼:

ForRequestedType<IAllowanceManager>().TheDefault.Is 
     .ConstructedBy(() => new Allowancemanager(new StateManager(), new TranslationManager())); 
+0

ARG1和ARG2這裏分別ITranslationManager和ISessionHelper被實例? – 2010-09-14 10:39:07

+0

是的,請查看我的編輯 – 2010-09-14 10:57:47

+0

請解釋StateManager和TranslationManager如何構建,因爲我看不到您傳遞所需的「文化」和「鍵」參數。 – 2010-09-14 11:07:26

1

使用2.6.1語法也可以寫爲:

For<ISessionManager>().Use<SessionManager>() 
    .Ctor<string>("key").Is(c => GetSessionKey()); 
For<ITranslationManager>().Use<TranslationManager>() 
    .Ctor<string>("culture").Is(c => Thread.CurrentThread.CurrentCulture.Name); 
For<IAllowanceManager>.Use<AllowanceManager>(); 

其中GetSessionKey的方式返回您的會話密鑰類似的文化是如何解決。

有關如何解析構造函數參數的更深入說明,請參見此blog entry

+0

這些類型被註冊在一個不在範圍內的註冊表類中,以檢索密鑰和culutre參數。這些參數在檢索實例時可用。 – 2010-09-14 11:09:33

+0

@Waliaula會話密鑰和文化來自哪裏?哪些對象可以訪問這些值? – PHeiberg 2010-09-14 11:16:10

+0

來自頁面上的查詢字符串訪問。現在爲什麼你的解決方案不起作用,就是映射是在一個註冊表類中完成的,該註冊表類然後被添加到global.asax文件中的Objectfactory中。這意味着在安裝過程中我沒有對「關鍵」和「文化」映射的訪問,但是在運行時實際檢索實例時我有這些映射。在下面查看我的口述。 – 2010-09-14 13:29:08

0

我想出了以下解決方案:

IStateManager stateManager = ObjectFactory 
    .With<string>("key") 
    .GetInstance<IStateManager>(); 

ITranslationManager translationManager = ObjectFactory 
    .With<string>("culture") 
    .GetInstance<ITranslationManager>(); 

manager = ObjectFactory 
    .With<ITranslationManager>(translationManager) 
    .With<IStateManager>(stateManager) 
    .GetInstance<IAllowanceDeductionManager>();