簡體   English   中英

通過接口和項目結構進行依賴注入

[英]Dependency Injection through Interface and project structure

這個問題很難解釋,但我會盡力而為。

我有一個項目,我必須在其中創建一個UI,該UI從第三方服務獲取數據並進行反序列化和一些線程管理工作。

現在,我的項目結構在Visual Studio中處於一種解決方案下:

項目A:UI

項目B:從第三方服務獲取數據的API

項目C:線程管理器API

注意:項目B具有IB接口,而項目C具有IC接口以幫助依賴性注入。 項目B和C將來會被其他團隊使用。

項目A使用IB和IC接口進行依賴項注入。

現在,我將陳述對IOC的理解:DIP表示高級模塊不應依賴於低級模塊,而高級模塊和低級模塊均應依賴於抽象。 如果要防止在更改低級模塊時更改高級模塊,則需要反轉控件,以使低級模塊不會控制高級模塊所需的接口和對象的創建。

根據以上定義,IB和IC接口都應在項目A中定義,對嗎? 如果他們在項目A中,那么其他團隊將如何使用IB和IC接口? 我是否要制作另一個單獨的項目來存儲接口?

考慮以下針對您的方案的示例項目組織:

項目A:Bootstrapper,負責運行應用程序,配置DI和設置UI(這也可以在與應用程序和UI分離的專用Bootstrapper項目中進行)。 知道B,C,D,E,F

項目B:UI(或使其模塊化所需的項目數)。 知道C

項目C:業務邏輯( gets data from a third party service and does deserialization and some thread management work )。 知道D

項目D:包含IB和IC的接口(它們也可以有單獨的專用項目)。

項目E: The API to get data from third party service 知道D

項目F: The Thread Manager API 知道D

注意,通過業務邏輯層從UI和實現中分離。 這樣,您可以切換實現細節,而不必更改業務邏輯或UI。 此外,如果您的業務邏輯有所不同,那么影響也將降至最低。

關於DI,bootstrapper項目是唯一具有整體情況的項目,其余項目應僅使用由bootstrapper設置的容器將為它們解析(即注入)的接口。

根據以上定義,IB和IC接口都應在項目A中定義,對嗎?

不能。您應該將“模塊”一詞替換為“類”。 在這種情況下,它變得更加有意義:

高級[類]不應依賴於低級[類],高級和低級[類]均應依賴於抽象。

為了能夠正確進行依賴注入,這些類和抽象位於哪個程序集中都沒有關系。 當項目變大時(例如,數百萬行代碼,一個或多個團隊在其中工作),遵守組件設計原則就變得很重要。

在您的情況下,由於程序集A和B都使用接口IB ,而程序集A依賴於程序集B,因此IB永遠都不能位於程序集A中,因為這樣會在程序集中引用一個圓形引用。 您將不得不將IB放置在裝配B中,或者放置在A和B都引用的新裝配中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM