2011-07-05 50 views
0

我是IoC初學者,我正面臨着實現IoC依賴注入的嚴重問題。IoC依賴注入確定Ajax中的類

我有一個應用程序有2個數據源,數據可能來自Solr或從數據庫。我有2個頁面,庫存頁面,顯示經銷商的所有車輛,其中quickSearch引擎從Solr獲取查找,例如Make,Model,...並將其顯示在下拉列表中,第二個頁面是VehicleDetails,顯示特定車輛加上諸如Make,Model之類的查找,但數據應該來自DataBase。

我已經創建LookupServiceSolr和LookupServiceSQL實現一個接口ILookupService在CastleControllerFactory:

_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSQL)).Named("LookupSQL")); 

_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSolr)).Named("LookupSolr")); 

的InventoryController將使用LookupServiceSolr和VehicleDetailsController將使用LookupServiceSQL,所以我也註冊他們這樣說:

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.InventoryController>().ServiceOverrides(ServiceOverride.ForKey("LookupService").Eq("LookupSolr")).LifeStyle.Is(LifestyleType.Transient)); 

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.VehicleDetailsController>().ServiceOverrides(ServiceOverride.ForKey("LookupService").Eq("LookupSql")).LifeStyle.Is(LifestyleType.Transient)); 

和InventoryController和VehicleDetailsController的構造函數具有LookupService作爲參數,並且所有在運行時都正常工作,這意味着vehicleDetail sController將通過LookupServiceSQL實現LookupService,而InventoryController將通過LookupServiceSOlr實現LookupService。

我的問題如下: 1-我是否正確實施IoC依賴注入? 2 - 這是我的主要問題,如果我有LookupController具有IlookupService在構造和VehicleDetailsController具有LookupController在構造函數中,我這樣註冊他們在容器:

_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSQL)).Named("LookupSQL")); 

_Container.Register(Component.For<MCI.Services.ILookupService>().ImplementedBy(typeof(MCI.Services.LookupServiceSolr)).Named("LookupSolr")); 

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.LookupController>().ServiceOverrides(ServiceOverride.ForKey("lookupService").Eq("LookupSolr")).Named("Vehicle").LifeStyle.Is(LifestyleType.Transient)); 

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.LookupController>().ServiceOverrides(ServiceOverride.ForKey("lookupService").Eq("LookupSQL")).Named("Details").LifeStyle.Is(LifestyleType.Transient)); 

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.InventoryController>().ServiceOverrides(ServiceOverride.ForKey("lookupController").Eq("Vehicle")).LifeStyle.Is(LifestyleType.Transient)); 

_Container.Register(Component.For<MCI.Presentation.Web.Controllers.VehicleDetailsController>().ServiceOverrides(ServiceOverride.ForKey("lookupController").Eq("Details")).LifeStyle.Is(LifestyleType.Transient)); 

所以實際上這是我的流量,它都工作正常: InventoryController - > LookupController - > LookupServiceSolr。 VehicleDetailsController - > LookupController - > LookupServiceSQL。

我的問題是,我有一個Ajax的帖子,make dropdownList會做一個ajax發佈更改並獲取基於make的模型,我想調用LookupController中的方法從視圖中立即離開視圖並且不傳遞通過知道我的lookupController有一個LookupServiceSQL的vehicleDetailsController,我想讓包裝器知道我想要LookupServiceSQL而不是LookupServiceSolr。 有沒有辦法做到這一點,或者有沒有不同的想法來解決這個問題?

請儘快獲得幫助。

由於提前, 阿拉

+0

請正確格式化代碼片段。 –

回答

0

我想你可能會過度設計有點。爲什麼不將LookupServices注入控制器,而只是使用與您的操作或參數相匹配的那一個,而不是將LookupController配置爲爲LookupService注入一個依賴項(LookupSolr和LookupSql的一組條件)?

變更登記鍵是這樣的:

ServiceOverride.ForKey("lookupServiceSolr").Eq("lookupSolr"), 
ServiceOverride.ForKey("lookupServiceSQL").Eq("lookupSQL"), 

...那麼你可以更簡單地使用它:

public class LookupController : ControllerBase 
{ 
    ILookupService LookupServiceSolr= null; 
    ILookupService LookupServiceSQL= null; 

    public LookupController(ILookupService lookupServiceSolr, ILookupService lookupServiceSQL) 
    { 
     LookupServiceSolr= lookupServiceSolr; 
     LookupServiceSQL= lookupServiceSQL; 
    } 

    // then use the one you want based on parameters or type of call 

}