1 回答

TA貢獻1805條經驗 獲得超9個贊
這是一個很好的問題 :) 但這也是一個陷阱 :) 盡管如此,我會根據自己的經驗跳出陷阱并回答,并接受這可能產生的強烈反對。
因此,在您的問題中,您描述了不同的場景,但主要問題可能是“如果我不知道我想在啟動時使用哪種實現怎么辦”。根據我的經驗,設計良好的系統很少出現這種情況。
當我試圖從總體上理解 DI 時,在軟件工程術語之外思考它很有幫助。DI 基本上無非就是應用接口來幫助你的組件協同工作;這一原則也適用于其他工程領域。
舉個例子:如果你拿一塊主板,它有用于基本構成 PC 的不同組件的插槽:它有一個用于 CPU 的插槽,一個用于顯卡的插槽等。然后你有英特爾制造的實際 CPU或與可插入插座兼容的AMD。并且您有Nvidia或ATI制造的顯卡(它們仍然存在嗎?:)),可以插入。原理相同:主板可以是在你的應用程序中的具體類,套接字是實際的 C# 語言接口(你沒有明確說明它,我假設 C#),這些被注入到你的具體類中(例如通過構造函數注入),然后你有其他類實現在啟動時注冊的接口(“套接字”)。
我解釋了這個類比來支持我的論點:如果您有一塊主板要用于您的 PC,則必須在啟動系統之前組裝所有組件。DI 也是如此:您可以隨時更改組件,這不是 DI 的魔力。DI 的神奇之處在于,如果您更改了一個組件,那不應該影響另一個組件。也就是說,如果您想插入不同的顯卡,則不必重建整個主板(以及可能的其他組件)。
話雖如此,確實有一些場景會出現您提供的示例并且您必須以某種方式欺騙系統(最常見于基于插件的系統中)。畢竟,如果我的類比擴展到 USB 或 HDMI,我們有即插即用設備,不需要您關閉然后進行更改。但是要細細說來,這些并不是 PC 的真正依賴項,只是可選的額外外圍設備,因此應該以不同的方式對待它們。但是為了不分叉并再次承認在某些情況下需要這種動態特性,這里有一些您應該研究的其他資源(請注意,這些是 Autofac 特定的實現,但大多數 DI 容器具有類似的功能):
枚舉隱式關系類型允許您在運行時解析注冊到服務的所有組件。
密鑰服務查找允許您向注冊添加密鑰并通過該密鑰解析服務;即,您可以從“服務字典”中選擇服務的組件。
裝配掃描允許您只指定一個裝配并從該裝配中獲取給定服務的組件。這可能是解析組件最動態的方法;我已經在基于插件的系統中使用了它。
- 1 回答
- 0 關注
- 139 瀏覽
添加回答
舉報