簡體   English   中英

使用存儲庫模式對查找表進行DDD和CRUD

[英]DDD and CRUD on lookup tables using repository pattern

因此,我嘗試遵循“域驅動設計”方法,並且不確定如何處理需要CRUD操作的查找表。 這是一個人為的例子來說明我的問題。

假設我有一個Person類

public class Person
{
    public string Address { get; private set; }
}

我的數據庫有一個人表和一個地址表。 人員表的Address_Id列是地址表的外鍵。 一個明顯的想法是,由於存在外鍵關系,因此您不能將地址表中不存在的地址值添加到人員表中。

在我的應用程序中,Person是一個聚合根,因此具有關聯的存儲庫。 使用存儲庫,我加載了人員,同時也加載了相關的地址。

我的問題是如何在“地址”表上執行CRUD操作? 遵循DDD原則,我認為不應該為Addresses表創建一個存儲庫。

我的應用程序的要求是,在創建新的Person對象時,將顯示一個地址下拉列表,用戶可以從中選擇一個地址。 不允許他們輸入地址,必須從已經存在的地址中選擇。 因此,對地址表的CRUD操作。 系統管理員將需要管理“地址”查找表,以便向創建“個人”對象的用戶提供正確的選擇。

同樣,這是一個非常人為的示例,我知道沒有人會設計這樣的系統。 只是為了幫助說明問題。

您是否曾經自己編輯或檢索地址? 該存儲庫本質上是一個業務對象到關系數據庫的映射器,它應該封裝對象的持久化方式,因此您不必擔心它。

如果對象保留在多個表中,則業務邏輯不必知道這一點,因此,除非您需要自己編輯Address對象,否則我不會為Address添加存儲庫。

看一看: 倉庫模式逐步說明

好吧,但是我猜屬性string Address應該是Address Address

在那種情況下,當您在PersonRepository上存儲Person時,如果基礎商店中不存在某些給定的Address ,則使用其特定於技術的實現的整個存儲庫將為您在Addresses關系表中創建整個地址注冊表。

另外,我猜您將在現有的數據映射器(OR / M)上使用存儲庫,這應該可以輕松管理這種情況:這只是將整個屬性映射為多對一關聯。

實際上,我相信存儲庫應該存儲根聚合,就像您在自己的問題中提到的那樣。

這取決於您自己的域。 如果一個地址可以與0個或多個人相關聯而可以單獨居住,則應考慮使用特定的AddressRepository添加地址,使用該地址注冊地址,以后AddressRepository其與某個Person關聯。

IMO,您有兩種用例:1)保存Person對象,但在2)之前列出所有可用地址,以便能夠選擇正確的地址。

因此,我將創建一個AddressRepository,也許不是CRUD,而是僅用於獲取實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM