3 回答

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

TA貢獻1825條經驗 獲得超4個贊
您可以根據您的注入架構在ResolvedParameter <T>(“ name”)中使用InjectionConstructor / InjectionProperty / InjectionMethod來獲取容器中預注冊對象的實例。
在您的情況下,此對象必須使用名稱注冊,并且為同樣起見,您需要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 關注
- 750 瀏覽
添加回答
舉報