2011-08-23 136 views
15

由於我正在重新構建遺留企業應用程序的某些核心組件,因此我第一次使用DDD(在.Net中)開始工作。DDD並實現持久性

我想澄清的是,我們如何在適當的DDD架構中實現持久性?

我意識到域本身是持久性的無知,應該使用「無處不在的語言」來設計,並且當然不會被迫進入本月的DAC甚至物理數據庫的約束。

我正確地說,存儲庫接口存在於域程序集中,但存儲庫實現存在於持久層中嗎?持久層包含對域層的引用,反之亦然?

從哪裏調用我的實際存儲庫方法(CRUD)?

回答

10

我是正確的庫接口住域 組件內,但 持久層中存在的庫實現?持久層包含對域層的引用,從不反過來?

是的,這是一個非常好的方法。

從哪裏調用我的實際存儲庫方法(CRUD)?

不用考慮CRUD術語可能是個好主意,因爲它太過於以數據爲中心,並且可能會導致您進入Generic Repository TrapRepository有助於管理domain objects的中期和生命末期。 Factories經常負責開始。請記住,從數據庫中恢復對象時,從DDD角度來看它處於中等階段。代碼如下所示:

// beginning 
Customer preferredCustomer = CustomerFactory.CreatePreferred(); 
customersRepository.Add(preferredCustomer); 

// middle life 
IList<Customer> valuedCustomers = customersRepository.FindPrefered(); 

// end life 
customersRepository.Archive(customer); 

您可以直接從您的應用程序調用此代碼。這可能值得下載,並看着埃文的DDD SampleUnit of Work模式通常用於處理交易和抽象選擇您的ORM。

+3

我同意德米特里在這裏所說的一切,爲清楚起見,我唯一要補充的是我建議你的客戶/ UI項目引用一個'Application Services'層,它調用域上的方法(域聚合或域服務)並從這裏調用存儲庫。這樣,所有的邏輯都包含在這個應用程序服務中,您可以輕鬆地更改/添加用戶界面。 –

+1

我只會在對應用程序有明顯好處時才添加服務層,而不僅僅是爲了它。服務層是一個額外的抽象層,在許多情況下你可以不用。 –

+0

@RobinvanderKnaap,事實並非如此,在實際軟件開發情況下,應用程序服務層始終是必需的。如果您將UI開發團隊交給域圖層,則可能a)不知道如何使用它,b)可能會濫用它。您需要明確界面可以使用您的業務API(域層)做什麼。 –

2

查看有關該主題的什麼Steve Bohlenhas to say。演示代碼可以在here找到。

我在演示文稿中發現了關於如何爲存儲庫建模的信息。

+0

非常好,絕對是我見過的最直接的DDD介紹。代碼很好,因爲它不像其他許多示例那樣花哨的管道。不幸的是,對於事情的實際情況,我真的很想找到幫助。 – EkoostikMartin

0

我是正確的庫接口住域 組件內,但 持久層中存在的庫實現?持久層包含對域層的引用,從不反過來?

我不同意在這裏,讓我們假設一個系統由以下層組成:

  • 表示層(贏表格,網頁形式,asp.net MVC,WPF,PHP,QT,JAVA, ios,android等。)
  • 業務層(有時被稱爲經理或服務,邏輯放在這裏)
  • 資源訪問層(手動或ORM)
  • 資源/存儲(RDBMS的NoSQL等)

假設這裏是你越高,圖層越不穩定(呈現最高,呈現最低,資源/存儲最低)。正因爲如此,您不希望資源訪問層引用業務層,這是相反的方式!業務層引用資源訪問層,您稱DOWN不UP!

您將接口/合同放在它們自己的程序集中,而它們在業務層中完全沒有用處。