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

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

Autofac - 在運行時解析類型或實現相同接口的類型

Autofac - 在運行時解析類型或實現相同接口的類型

C#
蠱毒傳說 2022-07-10 16:26:11
我是使用 IoC/DI 的新手,我正在學習 Autofac 以在我的 Xamarin Form、C# 項目中使用它。我正在閱讀 Autofac 文檔(https://autofac.readthedocs.io/en/latest/getting-started/index.html#application-execution),我對與應用程序執行部分相關的聲明感到困惑,它說:“稍后,如果您希望您的應用程序寫入不同的日期,您可以實現不同的 IDataWriter,然后在啟動時更改注冊。... ”我對此感到困惑,因為它說如果我想要不同的 IDataWritter,我需要在啟動時更改注冊。如果我不知道我想在啟動時使用哪個 IDataWritter 實現怎么辦。例如,我有由 ClassA、ClassB 和 ClassC 實現的 IDataWritter 接口,在運行時,我必須以某種方式解決 3 個或全部 3 個?
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

這是一個很好的問題 :) 但這也是一個陷阱 :) 盡管如此,我會根據自己的經驗跳出陷阱并回答,并接受這可能產生的強烈反對。

因此,在您的問題中,您描述了不同的場景,但主要問題可能是“如果我不知道我想在啟動時使用哪種實現怎么辦”。根據我的經驗,設計良好的系統很少出現這種情況。

當我試圖從總體上理解 DI 時,在軟件工程術語之外思考它很有幫助。DI 基本上無非就是應用接口來幫助你的組件協同工作;這一原則也適用于其他工程領域。

舉個例子:如果你拿一塊主板,它有用于基本構成 PC 的不同組件的插槽:它有一個用于 CPU 的插槽,一個用于顯卡的插槽等。然后你有英特爾制造的實際 CPU或與可插入插座兼容的AMD。并且您有Nvidia或ATI制造的顯卡(它們仍然存在嗎?:)),可以插入。原理相同:主板可以是在你的應用程序中的具體類,套接字是實際的 C# 語言接口(你沒有明確說明它,我假設 C#),這些被注入到你的具體類中(例如通過構造函數注入),然后你有其他類實現在啟動時注冊的接口(“套接字”)。

我解釋了這個類比來支持我的論點:如果您有一塊主板要用于您的 PC,則必須在啟動系統之前組裝所有組件。DI 也是如此:您可以隨時更改組件,這不是 DI 的魔力。DI 的神奇之處在于,如果您更改了一個組件,那不應該影響另一個組件。也就是說,如果您想插入不同的顯卡,則不必重建整個主板(以及可能的其他組件)。

話雖如此,確實有一些場景會出現您提供的示例并且您必須以某種方式欺騙系統(最常見于基于插件的系統中)。畢竟,如果我的類比擴展到 USB 或 HDMI,我們有即插即用設備,不需要您關閉然后進行更改。但是要細細說來,這些并不是 PC 的真正依賴項,只是可選的額外外圍設備,因此應該以不同的方式對待它們。但是為了不分叉并再次承認在某些情況下需要這種動態特性,這里有一些您應該研究的其他資源(請注意,這些是 Autofac 特定的實現,但大多數 DI 容器具有類似的功能):

  • 枚舉隱式關系類型允許您在運行時解析注冊到服務的所有組件。

  • 密鑰服務查找允許您向注冊添加密鑰并通過該密鑰解析服務;即,您可以從“服務字典”中選擇服務的組件。

  • 裝配掃描允許您只指定一個裝配并從該裝配中獲取給定服務的組件。這可能是解析組件最動態的方法;我已經在基于插件的系統中使用了它。


查看完整回答
反對 回復 2022-07-10
  • 1 回答
  • 0 關注
  • 139 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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