0

這個問題有點難以解釋,但我會盡我所能。通過Inteface和項目結構進行依賴注入

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

我的項目結構是在Visual Studio中的一個解決方案:

項目答:UI

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

項目C的API:線程Manager API

注意: 項目B有一個IB接口,C有一個IC接口來幫助依賴注入。項目B和C將在未來由其他團隊使用。

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

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

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

+1

您的用戶界面確實反序列化?這不是一個UI的東西... – Steve

+0

不,我有一個單獨的項目來做到這一點..我已經解釋了上面。 – Debdeep

回答

1

考慮您的方案如下例如項目組織:

項目A:引導程序,負責運行該應用程序,配置DI和設置界面(這也可以去解耦專門的引導程序項目從應用程序和用戶界面)。 誰知B,C,d,E,F

項目B:用戶界面(或根據需要使其模塊化儘可能多的項目)。 知道C

項目C:業務邏輯(gets data from a third party service and does deserialization and some thread management work)。項目D:包含IB和IC的接口(它們也可以有單獨的專用項目)。

項目E:The API to get data from third party service誰知d

項目F:The Thread Manager API誰知d

通知從UI去耦,並通過業務邏輯層執行。這樣,您可以切換實施細節,而無需更改業務邏輯或用戶界面。另外,如果您的業務邏輯發生變化,則影響最小化。

關於DI,引導程序項目是唯一具有整個圖片的程序,其餘的應該只使用由引導程序設置的容器爲其解析(即注入)的接口。

+0

什麼是BI和CI ..是你的IB和IC嗎?如果是,那麼我們有一個單獨的項目定義接口? – Debdeep

+0

@Debdeep對不起,這是一個錯字:是的,他們會進入一個單獨的項目,所以你可以將他們的具體實現與使用它們的其他項目分開(例如項目C)。 – jnovo

+0

其實我不需要項目C和E分開,它們在C內部,因爲C獲取數據併爲我反序列化(不需要業務邏輯)。但是我需要向其他團隊提供項目C和F作爲dll。那麼我是否也需要提供項目D作爲單獨的dll? – Debdeep

0

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

不可以。您應該用'class'替換'module'一詞。在這種情況下,它開始更有意義:

高水平[類]不應該依賴於低級別[類]兩者 高層次和低層次[班]應該依賴於一個抽象。

爲了能夠做到依賴注入正確的,它並不重要,其中組件的類和抽象所在。當項目變得更大時(即數百萬行代碼,一個或多個團隊在其上工作),遵守Principles of Component Design就變得很重要。

對於您的情況,由於組件A和組件B使用接口IB,並且組件A依賴於組件B,所以IB永遠不能位於組件A中,因爲這會在組件中出現循環引用。您必須將IB放置在裝配體B中,或放入A和B所指的新裝配體中。