2009-06-30 90 views
5

我目前代表我的應用程序中的單個項目中的業務層和數據層。我在兩套課程之間有很好的分離關係。但是,我的數據層類作爲參數並返回我的業務對象。因此,我將不得不代碼大概類似於(請不要太挑剔這個代碼,我的生產代碼看起來並不喜歡這個):如何完全分離我的業務層和數據層?

//business class fragment 
public bool Save() 
{ 
    if(this.IsValid) 
    { 
     //DataProvider is one of many data access classes that implement an IDataProvider interface. Switched elsewhere in the class. This allows switching of Database providers, xml, etc. 
     DataProvider.Save(this); 
     return true; 
    } 
    return false; 
} 

public List<MyBusinessObject> GetObjectsByCriteria(string criteria) 
{ 
    return DataProvider.GetMyBusinessObjectsByCriteria(criteria); 
} 

我不希望我的業務類有處理DataSets比我更喜歡讓我的數據層類處理業務類。

我已經讀了很多數據訪問對象或數據傳輸對象來解決這個問題,但這似乎是這些模式的反模式案例。

我該怎麼辦?如何優雅地實現我的應用程序的這兩個層的完全分離?

回答

2

這是一個比如何將域模型與數據訪問分開的更普遍的問題。當您嘗試將應用程序邏輯與領域模型,應用程序邏輯的演示模型等分開時,會出現同樣的問題。

常見的解決方案是稱爲依賴注入(DI)的技術。有些人也將其稱爲控制反轉(IoC)。

關於這個問題的開創性文章是Martin Fowler的文章Inversion of Control Containers and the Dependency Injection pattern,但是從那以後我們已經走過了很長的路,所以一定要研究一些更近期的文章。

您可以手動執行DI,如described in this blog post,或者您可以讓DI容器(即,一個框架)爲你做好工作。

通用的DI容器是:

1

從業務對象中提取持久性邏輯並將其放入數據Adapter。它的工作方式就像.NET中現有適配器的工作方式(OleDbDataAdapter)。這樣你也將分離你的業務對象和持久性邏輯。

你的客戶代碼會稍微冗長些,但我認爲這是真正分離圖層的最好方法。

+0

這是我們所做的,但我們也將它與DTO結合起來。 – 2009-07-01 01:04:32

0

這樣做的流行模式是Repository模式。在這種情況下,存儲庫充當使用集合語義的外觀,完全隱藏持久數據所在的位置,無論是文件系統還是數據庫。您可以實現它來訪問數據,然後將數據映射到您想要使用的任何類型。

您可能會將域驅動設計視爲您使用的Active Record模式的替代方案。

0

你應該看看DAO模式(數據訪問對象)。 http://en.wikipedia.org/wiki/Data_Access_Object

最好的是,使用現成的DAO構造(彈簧加載)。看看http://trac.synyx.org/hades

DAO不是反模式!使用它們與春天和泛型,你不必在意;)

有層次之間的每一次連接!完全分離它們意味着它們沒有可用性進行通信(所以它們是無用的)。

使用基本的CRUD操作或動態查找器,無論它是否具有語義意義。

2

我不認爲你可以有兩個完全分開的,但你可以確保依賴不是雙向的。

我想定義一個幾件事情是很重要的:

  1. 模型對象(例如,人,地址,訂購等)
  2. 持久層(例如,DAO中,倉庫等)
  3. 服務層(其方法映射到用例,知道工作單元等的接口)
  4. web或查看圖層(控制器/網頁應用程序,桌面小部件)。

持久層,服務層和視圖層瞭解模型對象;模型對象是無視他們所在的層

對於諸層中的依賴關係是單向的,並流回到前:

  • persistence->模型
  • 服務 - >模型,持久性
  • 視圖 - >模式,服務從後到前

你的單元測試,因爲依賴關係可以很容易地嘲笑。

不可能有沒有依賴,但你應該設計它們,所以沒有周期。

唯一的類沒有依賴關係是一個被稱爲沒有人,從不調用另一個類。這既不有用也不是一個有價值的設計目標。

+0

我在Nosredna的問題上沒有看到「很好的分離問題」。我認爲這個帖子migth澄清了一些概念和幫助。好帖子,duffymo! – 2009-08-04 21:37:05

0

n層設計:在業務邏輯層中,您可以創建數據訪問類和數據操作類。總是編程到一個接口。