3 回答

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

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以根據(jù)您的注入架構(gòu)在ResolvedParameter <T>(“ name”)中使用InjectionConstructor / InjectionProperty / InjectionMethod來(lái)獲取容器中預(yù)注冊(cè)對(duì)象的實(shí)例。
在您的情況下,此對(duì)象必須使用名稱注冊(cè),并且為同樣起見(jiàn),您需要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)注
- 749 瀏覽
添加回答
舉報(bào)