2011-01-05 58 views
3

我目前使用Ninject在WCF服務應用程序中創建接口的實例。Ninject - 如何動態選擇一個實現綁定到一個接口

Bind<IObjA>().To<ObjA>().InRequestScope(); 
Bind<IObjB>().To<ObjB>().InRequestScope(); 
Bind<IObjC>().To<ObjC>().InRequestScope(); 

它很好用,但我們將有幾個IObjC的實現。對於IObjA/IObjB的接口繼續爲實現進行流體分配,但允許爲IObjC配置分配,我有哪些選擇?

我發現一個related question on SO,但我不知道我是否可以同時支持流體和可配置的方法。

例如,我可以在IObjC中使用Ninject.extensions.xml,同時繼續爲IObjA和IObjB使用上述方法嗎?

建議對IObjC進行條件賦值嗎?這看起來很髒,但同時顯得非常簡單。

if (condition1) 
    Bind<IObjC>().To<ObjC1>().InRequestScope(); 
else if (condition 2) 
    Bind<IObjC>().To<ObjC2>().InRequestScope(); 

此外,我知道其他框架,如城堡支持XML配置,但我想繼續使用Ninject。

回答

5

1 - 您與IObjC的綁定與任何其他綁定無關。無論您在哪裏,何時或如何綁定其他服務都無關緊要。

2 - 你可以使用XML擴展,但我會問你爲什麼認爲你需要它是可配置的。

3 - 有條件的可能性有2種。首先是您想在啓動時做出決定,以確定是否在應用程序的整個生命週期中使用ObjC1,或者ObjC2。如果是這樣的話,你的代碼就可以了。但是,如果你要動態地決定要使用哪個對象每次解析綁定,你需要把狀態裏面你的綁定,就像這樣:

Bind<IObjC>().ToMethod(ctx => condition ? ctx.Kernel.Get<ObjC1>() : ctx.Kernel.Get<ObjC2>()); 

交替,您可以使用命名綁定:

Bind<ILog>().ToConstant(LogManager.GetLogger("Accounting")).Named("Accounting"); 

或「當」條件,以幫助:

Bind<ILog>().ToConstant(LogManager.GetLogger("Background")).When(context => context.Target != null && context.Target.Name == "backgroundLogger"); 
+1

2 - 想象一下,你想在不同的機器相同PROGRAMM文件(.exe),讀取來自不同數據庫或XML(不相同的數據結構)數據S o您需要配置至少在每種情況下使用的DAL。你會怎麼做? – Morvader 2012-11-06 12:43:22

+0

你會不會在app.configs中有不同的連接字符串?否則,那將是擁有XML配置的好時機。 – 2012-11-06 18:29:28

相關問題