2011-09-09 53 views
1

如果我有一個由多個圖層組成的應用程序,它定義爲解決方案中的多個項目,可以讓圖層直接在上方/下方引用圖層嗎?或者,應該使用依賴注入來消除這種需求嗎?在多層體系結構中,可以讓相鄰層相互引用嗎?

我在建議一個更具體的問題,我問here,但我想要更多的一般性建議。

我該如何着手在VS2010中設置這樣的項目?我需要一個第三個項目,以容納DI東西(我使用Ninject)

編輯:例如

這裏是我的兩個層的一個例子。第一層具有IUnitOfWork接口,第二層具有實現所述接口的類。按照這種方式安裝,除非第2層有對第1層的引用,否則該項目不會生成。我該如何避免這種情況?或者,我應該甚至不擔心引用,因爲這些圖層是彼此相鄰的,所以不要單獨放置它?

1個

public interface IUnitOfWork 
{ 
    void Save(); 

} 

2層

public DataContext : IUnitOfWork 
{ 
    public void Save() 
    { 
      SaveChanged(); //... 
    } 
} 

回答

1

一般的建議是通過接口來分離層,並使用依賴注入和IOC容器的靈活性極大的水平,同時保持應用程序。 但有時它可能是小應用程序的矯枉過正,所以爲了給你一個更具體的例子,你必須至少提供它所具有的應用程序和圖層的描述。

關於DI的東西,我建議把它封裝在一個單獨的程序集中。回答到關於評論界面

只有一個辦法擺脫這種耦合的是存儲在一個單獨的組件共用接口/類:

由Martin Fowler Inversion of Control Containers and the Dependency Injection pattern

EDIT見大文章。在你的情況下創建單獨的程序集,並放在這裏是IUnitOfWork接口。

編輯: Ninject項目中引用

有147個Ninject項目,我建議下載和調查從您的角度來看最有趣:Ninject projects

+0

感謝您的迴應。我已閱讀福勒文章,這很棒。我想我的困惑源於假設如果一個圖層實現另一個圖層的接口,如果我沒有從實現圖層到接口所在圖層的引用,如何構建解決方案? – stephen776

+1

在單獨的組件中提取接口,該組件將被所有圖層引用並使用DI。 –

+0

上面增加了一個例子 – stephen776

1

這是一個已知的「緊耦合VS鬆耦合耦合「的困境,並沒有一般的建議。它很大程度上取決於組件的規模,它們如何互動,它們多久發生一次變化,哪些團隊在其上進行工作,構建時間是多少。

我的一般建議是保持平衡。不要因爲每個迷你班的脫鉤而變得瘋狂,另一方面,不要創造出一個小小的修改導致整個世界重建的龐然大物。

  • 凡變化預計,青睞鬆散耦合組件
  • 當穩定的預期,青睞緊耦合組件

它始終是一個權衡:

有與每項決定相關的費用:

必須在緊密耦合的組件上進行更改的成本衆所周知。 -The變化是侵入性的 - 它可能需要大量的工作,以確定在依賴鏈的一切 - 它很容易錯過依賴 - 它是很難保證質量

在另一方面,過度的成本工程是太糟糕 -code膨脹 - 複雜 -slower發展 -difficult新開發成爲生產

要將例如: 看看交通燈實例與微軟的統一應用程序塊 磨磨蹭蹭

+0

重新設計如下'IUnitOfWork'包含要保存的數據。 'IUnitOfWorkLogic' - 在'IUnitOfWorkNotifier'上保存或執行一些其他工作的對象,它調用它。所有這些在同一個接口程序集中聲明。 –

0

人們已經回答了您的問題。我建議「下面」圖層不應該引用「上面」圖層,因爲下面的圖層目的是提供上面圖層消耗的某些功能,因此它不應該知道上面圖層的任何內容。就像TCP/IP堆棧的好層模型