2008-10-07 103 views
5

設計業務對象時,我嘗試了幾種不同的寫入數據訪問層的方法。有些人的工作比其他人好,但我一直覺得必須有一個「更好」的方式。業務對象DAL設計

我真的很想看到人們在不同情況下處理DAL的不同方式,以及他們對技術工作方式或工作不正常的看法。

回答

2

不幸的是我不認爲有一個「更好的方法」,它太依賴於你使用什麼DAL方法的具體情況。 Martin Fowler對「最先進的」藝術作了精彩的討論。Patterns of Enterprise Application Architecture

第10章數據源體系結構模式專門討論了大多數業務應用程序最常用的模式。

總的來說,我發現使用最簡單的方法來滿足基本的可維護性和適應性要求是最好的選擇。

例如,在最近的項目中,我只需要一個簡單的「行數據網關」。 (這只是每個相關數據庫表的代碼生成類,包括執行CRUD操作的方法)。沒有關於ORM與存儲過程的無盡爭論,它只是工作,並且完成了所需的工作。

+0

我同意,對於不同的情況,答案會不同,但我只是尋找一些不同的技術和他們是如何制定的。 – 2008-10-07 12:37:31

1

有幾種常見模式。 'The patterns of enterprise architecture'本書是爲這些很好的參考:

  • 表數據網關
  • 行數據網關
  • 活動記錄
  • 數據映射

如果使用ORM,如LLBLGEN,您可以選擇自助服務或適配器。

4

我現在很依賴Billy McCafferty's NHibernate Best Practices article/sample code來處理很多Web/WinForms應用程序。這是一篇精彩的文章,將爲您提供一個良好的實例架構 - 除了教您基本的NHibernate和TDD。他試圖給你一個他的架構和設計決策的概述。

他使用通用的DataAccessObjects創建了一個非常優雅的DAL,您可以爲每個域對象擴展它 - 它使用接口和DAOFactory非常鬆散地耦合到BL。我建議首先查看BasicSample,特別是如果您之前沒有使用過NHibernate。

請注意,這篇文章很大程度上依賴NHibernate,但我認爲它可以很容易地改變以適應其他ORM的一般方法。

1

如果你正在關注NHibernate路由(上面@Watson的好文章鏈接),那麼我強烈建議你從codebetter簽出suvius-flamingo示例項目。他有一個很好的,簡潔的示例項目,展示了MVC和NHibernate的行動。

這是suvius-flamingo link

1

[更新]這是不再有效,該項目的設計被改變[/更新]

在我們的開源項目不粘鍋,我們的結論是,業務對象(整個組件)是核心系統和所有東西都應該圍繞着它,包括數據訪問層。

業務組件將決定其他人需要什麼,暗示通過界面。例如業務對象將有一個名爲IRepositoryForPerson的接口成員,當需要時該成員將通過依賴注入容器分配一個實例。

有關詳細信息在這裏查看我的博客文章:

http://www.emadashi.com/index.php/2008/11/data-access-within-business-objects-bunian-design//

這裏檢查不粘鍋的代碼(雖然這是業餘尚未):

http://www.codeplex.com/Bunian

當然就會有層出不窮的新這種方法就像數據訪問會話的生命週期一樣(如果你使用的是NHibernate)。但是這將是另一個問題,我猜這是

我希望你發現這很有

1

我會假設你的意思寫正在訪問SQL一個DAL,因爲這是目前最常見的部分。如果在編寫針對SQL的DAL時遇到的最大問題是ORM部分。也就是說,OO編程和關係數據庫模式之間存在基本的阻抗不匹配。在編寫ORM方面有很多偉大而成功的嘗試。但是他們都遭受同樣的問題,這是他們的好處:他們將您從正在生成的底層SQL抽象出來。爲什麼這是一個問題,因爲數據庫的性能是整個系統性能良好的關鍵因素。許多ORM(可能是大多數)不僅對許多標準查詢的性能不盡如人意,而且實際上鼓勵使用會大大降低性能的使用模式(在查詢集合作爲一個常見示例時,在循環內重複地遍歷關係,從而難以解決死鎖問題另一個)。當然,在詳細瞭解ORM API之後,通常可以找到解決這些性能問題的方法。

我目前對ORM的態度是,我希望它儘可能少做,同時仍然給我一個堅實的庫的效率,照顧所有的數據訪問的堅果和螺栓。換句話說,因爲我不認爲它們「足夠好」,並且可能永遠不會以SQL作爲後端,所以我想要保留裸機級別的控制權,並且我將下降到編寫SQL因爲我知道具體的方式,我希望根據我的需求查詢數據的具體方式。

這顯然是一種更脆弱的編碼方式,如果你宗教上使用ORM是因爲它的意圖,所以你必須在單元測試,SQL注入和適當的問題分離方面加倍努力。總之,我同意Ash的觀點,雖然這並不意味着他/她同意我:)