亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以將構造函數參數傳遞給Unity的Resolve()方法嗎?

我可以將構造函數參數傳遞給Unity的Resolve()方法嗎?

斯蒂芬大帝 2019-12-26 09:02:39
我正在使用Microsoft的Unity進行依賴項注入,并且我想執行以下操作:IDataContext context = _unityContainer.Resolve<IDataContext>();var repositoryA = _unityContainer.Resolve<IRepositoryA>(context); //Same instance of contextvar repositoryB = _unityContainer.Resolve<IRepositoryB>(context); //Same instance of contextIDataContext context2 = _unityContainer.Resolve<IDataContext>(); //New instancevar repositoryA2 = _unityContainer.Resolve<IRepositoryA>(context2);RepositoryA并且RepositoryB都有一個構造函數的IDataContext參數,我想團結與我通過它的上下文初始化存儲庫。另請注意,該代碼IDataContext未在Unity中注冊(我不需要3個實例IDataContext)。
查看完整描述

3 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

<2美分>


如果您以后決定使用需要更多或更少的服務而不只是上下文,該怎么辦?


構造函數參數和IoC的問題在于,這些參數最終會與所使用的具體類型相關聯,而不是成為服務接口定義的合同的一部分。


我的建議是,您也可以解析上下文,并且我相信Unity應該為您提供一種避免構造它的3個實例的方法,或者您應該考慮一種可以為您構造對象的工廠服務。


例如,如果您以后決定構建一個完全不依賴傳統數據庫的存儲庫,而是使用XML文件為測試生成偽數據該怎么辦?您將如何向該構造函數提供XML內容?


IoC基于解耦代碼,通過將參數的類型和參數的語義綁定到具體類型,您確實沒有正確地進行解耦,仍然存在依賴性。


“只要實現此接口,此代碼就可以與任何類型的存儲庫進行對話。...哦,并使用數據上下文”。


現在,我知道其他IoC容器也對此提供支持,我在自己的第一個版本中也對此提供了支持,但我認為它不屬于解決步驟。


</ 2美分>


查看完整回答
反對 回復 2019-12-26
?
鳳凰求蠱

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")));


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 750 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號