2

UI應用基礎設施層。基礎設施服務合同在哪裏生活?

應用層的我基礎設施層取參考使用註冊Ninject兩者的服務接口。

但我在應用層需要基礎設施層服務,然後我需要引用基礎設施層在我應用層。

問題是基礎設施層取參考應用層時,我會引用基礎設施應用層以下錯誤顯示:

一提到「基礎設施'無法添加。添加這個項目作爲參考會導致循環依賴。

我該如何解決?把Ninject配置爲應用程序圖層在應用程序圖層?我認爲這是不正確的,因爲我會有基礎設施實現在我的應用層。

回答

3

基礎設施服務合同應該在消費它們的層(域和應用程序)中定義,但在基礎結構中實施。看看Dependency Inversion PrincipleOnion Architecture。基礎設施層應該依賴於應用程序和域。您的域和應用程序不應該依賴基礎架構。他們應該依靠自己定義的抽象。你可能會發現這個answer有趣。這個抽象的實際實現應該在應用程序啓動時注入一個所謂的Composition Root

例如,在您的應用程序,你可以定義和接口,如:

ICanNotifyUserOfSuccessfullRegistration 

基礎設施層將參考應用和使用SMTP或SMS類將實現這個接口:

class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { ... } 

關於這個版本實施將通過DI容器注入應用程序。應用程序不會依賴基礎架構,但仍將使用它,因此Dependecny Inversion。我建議您閱讀Dependency Injection in .NET,即使您使用Java或其他堆棧。

+0

應用層使用基礎設施服務,對吧?基礎架構服務在基礎架構層? –

+0

是的,但'使用'並不意味着'依賴/引用'。看到我的答案。應用程序使用基礎架構而不依賴它 - 依賴性轉換原則。 – Dmitry

+0

是的,我使用DI,但我的基礎設施服務合同(接口)在基礎設施層。 –

1

聽起來像你的圖層要麼太緊密耦合,要麼有錯誤的邊界。你可以通過引入生活在他們自己的項目中的接口來解耦這些層,並且可以被其他接口引用。

+0

基礎架構層具有所有層的Ninject配置?如果是,我的圖層是正確的... –

+0

對循環依賴的需要暗示了其他內容,但是我知道些什麼。我可能無法幫到你。 –

+0

@丹尼斯。準確地說..這就是我們如何繼續進行我們的項目結構。這裏有一個問題。很抱歉,它沒有太多的OPs問題的答案。但是應用程序和域之間有什麼區別。我的猜測是,域是你的域實體的地方,應用程序是你應用業務邏輯,域實體的規則的地方? –