天天看點

一起談.NET技術,在.NET中使用域對象持續模式

  域應用程式對象通常是整個應用程式的中心,被很多子系統使用。它們表現了核心的資料和業務驗證規則;是以,良好的域對象設計對于牢固的、高性能的和靈活的應用程式非常關鍵。

  當我們開發那些使用了關系資料庫的面向對象應用程式的時候,建立與資料庫設計一緻的域對象設計可以使應用程式更容易了解,這是因為在典型情況下,域對象表現了現實的"實體"和它們彼此之間的關系。是以,在很多情形下,域對象都被"映射"為關系資料庫表和表間關系。但是,這種映射非常容易出錯,進而以不合需要的域對象設計為終結。域對象的良好設計要求開發者對面向對象和關系的基本原理有深刻的了解。

  域對象持續(Domain Objects Persistence)模式試圖提供一種向關系資料庫的映射關系,解除域對象與持續性邏輯之間的耦合關系。在這種模式中,域對象自身是不知道持續性機制的,因為其依賴關系是單方向的(從持續性對象到域對象)。這簡化了域對象的設計,使它們更容易了解。它也向應用程式中的那些使用了域對象的子系統隐藏了持續性對象。更好的是,這種模式可以在分布式系統中使用,在這種情況下,隻有域對象四處傳遞,使應用程式不用把持續機制暴露給外部代碼。本文示範了如何使工廠(Factory)模式和域對象持續模式一起工作,來幫助域對象與持續性邏輯解除耦合。

  定義問題

  域對象是所有應用程式的中樞。它們捕獲了資料庫的核心資料模型和應用在資料上的業務規則。在典型情況下,應用程式的大多數子系統都依賴這些通用的域對象--這意味着域對象的映射越接近資料庫大綱,應用程式開發者了解和使用它們就越容易,因為它們表現了資料庫中的現實"實體"和"關系"。

  如果域對象沒有與應用程式的其它部分分開,你通常就得把持續性代碼複制到很多個位置。同樣,如果域對象沒有與持續性代碼分開,你遇到的情況就是,任何使用域對象的子系統都必須知道并依賴持續性對象。對持續性對象的任何更改都必然影響整個應用程式。是以,如果沒有把域對象與應用程式和持續性代碼分開都是不好的設計。

  定義解決方案

  實作上述目标的一個途徑是把域對象分離到一個獨立的子系統中,讓應用程式的其它部分需要域資料的時候再使用它們。此外,你還必須把域對象與持續性代碼分開。一方面,這種雙重分離避免了代碼重複;另一方面,它向域對象隐藏了持續性細節資訊,建立了更容易修改的靈活設計。無論資料來自關系資料庫、XML檔案、平面檔案、活動目錄/LDAP或其它任何資料源,域對象和應用程式的其它部分都完全不會受到影響。

  在分離持續性邏輯和域對象的過程中,你必須確定域對象沒有依賴持續性代碼。這樣操作允許你把域對象暴露在那些你不希望暴露持續性代碼的地方。

  建立示例

  下面的C#示例使用了Northwind示例資料庫的Customer對象,它映射到資料庫的Customer表。

  在上面代碼中,load方法根據CustomerID(應用程式可以把這個值傳遞到任何子系統中而不需要暴露持續性代碼)從資料庫中載入Customer對象。同樣,如果你載入Customer對象的數組清單,你随後也可以傳遞數組清單,也沒有持續性代碼依賴。

  使用域對象持續模式分離持續性代碼和Customer對象,使得Customer對象更加面向對象,更易于了解,因為它的對象模型更加接近于資料庫中的資料模型。此外,這種分離使你能夠把Customer傳遞到應用程式的不同部分(甚至于通過.NET Remoting傳遞到分布式應用程式),而不需要暴露持續性代碼。