3 回答

TA貢獻1898條經(jīng)驗 獲得超8個贊
<2美分>
如果您以后決定使用需要更多或更少的服務(wù)而不只是上下文,該怎么辦?
構(gòu)造函數(shù)參數(shù)和IoC的問題在于,這些參數(shù)最終會與所使用的具體類型相關(guān)聯(lián),而不是成為服務(wù)接口定義的合同的一部分。
我的建議是,您也可以解析上下文,并且我相信Unity應(yīng)該為您提供一種避免構(gòu)造它的3個實例的方法,或者您應(yīng)該考慮一種可以為您構(gòu)造對象的工廠服務(wù)。
例如,如果您以后決定構(gòu)建一個完全不依賴傳統(tǒng)數(shù)據(jù)庫的存儲庫,而是使用XML文件為測試生成偽數(shù)據(jù)該怎么辦?您將如何向該構(gòu)造函數(shù)提供XML內(nèi)容?
IoC基于解耦代碼,通過將參數(shù)的類型和參數(shù)的語義綁定到具體類型,您確實沒有正確地進行解耦,仍然存在依賴性。
“只要實現(xiàn)此接口,此代碼就可以與任何類型的存儲庫進行對話。...哦,并使用數(shù)據(jù)上下文”。
現(xiàn)在,我知道其他IoC容器也對此提供支持,我在自己的第一個版本中也對此提供了支持,但我認(rèn)為它不屬于解決步驟。
</ 2美分>

TA貢獻1825條經(jīng)驗 獲得超4個贊
您可以根據(jù)您的注入架構(gòu)在ResolvedParameter <T>(“ name”)中使用InjectionConstructor / InjectionProperty / InjectionMethod來獲取容器中預(yù)注冊對象的實例。
在您的情況下,此對象必須使用名稱注冊,并且為同樣起見,您需要ContainerControlledLifeTimeManager()與LifeTimeManager。
_unityContainer.RegisterType<IDataContext,DataContextA>("DataContextA", new ContainerControlledLifeTimeManager());
_unityContainer.RegisterType<IDataContext,DataContextB>("DataContextB");
var repositoryA = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));
var repositoryB = _unityContainer.Resolve<IRepositoryB>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextA")));
var repositoryA2 = _unityContainer.Resolve<IRepositoryA>(new InjectionConstructor(
new ResolvedParameter<IDataContext>("DataContextB")));
- 3 回答
- 0 關(guān)注
- 760 瀏覽
添加回答
舉報