ORM中的Model與DDD中的DomainModel

0.引言

在現有的系統開發中,大部分的系統應該都會用到ORM,無論用的是EF還是NHibernate。作為對象和持久化數據的橋梁,ORM確實非常方便,以至于在DDD的時候,我們很自然的將 ORM中的Model(實體)表達成DDD中的 DomainModel(領域對象)。

但這真的合理嗎?我們先引入兩個例子來探討這個問題。

1.例子1:訂單聚合

下述聚合引自湯神的博客:

我們看以上的聚合設計非常經典。Order對象作為聚合根,OrderItem建模成實體,只要在當前的訂單聚合中不重復即可。

但在真正的數據存儲的時候,我們的OrderItem對象肯定不能是這樣子的。

假如:我們有兩個訂單A和B,訂單A包含了商品1和商品2,訂單2包含商品2和商品3。

那么很明顯我們如果以OrderItem這個實體去存儲,必然會造成主鍵重復。在實際存儲的時候我們肯定也會為OrderItem增加其他的字段用來存儲他自己的主鍵信息。

比如我們給他建立一個獨立的ID:

 public class OrderItem{/// <summary>/// 訂單項ID/// </summary>public string Id { get; set; }public string ProductId { get; set; }public string ProductName { get; set; }public float Price { get; set; }public int Count { get; set; }}

或則采用聯合主鍵:

    public class OrderItem{/// <summary>/// 訂單ID/// </summary>public string OrderId { get; set; }public string ProductId { get; set; }public string ProductName { get; set; }public float Price { get; set; }public int Count { get; set; }}

2.例子2:旅館聚合與房間聚合

在旅館信息系統管理里面,對旅館的操作會有獨立的模塊,參考聚合的設計原則

  1. 如果領域內的一個對象,我們會在后臺有一個獨立的模塊去管理它,那它基本上也是聚合根了;

所以我們建立旅館聚合,代碼如下:

    public class Hotel{/// <summary>/// 聚合跟id/// </summary>public string Id { get; set; }/// <summary>/// 值對象/// </summary>public string Name { get; set; }/// <summary>/// 房間列表 此處簡單標示        /// </summary>public IList<string> Rooms { get; set; }//其他信息略//...}

對于旅館房間的也一樣我們會有單獨的模塊去管理,而且房間有單獨的狀態標示(房間是否有人入住,是否空房等等)

房間聚合如下:

  public class Room{/// <summary>/// 房間id/// </summary>public string Id { get; set; }public string Name { get; set; }public string RoomType { get; set; }// 空 已預訂,已入住,臟房間等狀態public RoomStatus Status { get; set; }/// <summary>/// 旅館聚合根ID/// </summary>public string HotelId { get; set; }}

如果是在ORM中上述很可能表達成如下實體:

    public class Hotel{public string Id { get; set; }public string Name { get; set; }/// <summary>/// 房間列表    /// </summary>public virtual IList<Room> Rooms { get; set; }//其他信息略//...}

和房間實體

 public class Room{/// <summary>/// 房間id/// </summary>public string Id { get; set; }public string Name { get; set; }public string RoomType { get; set; }// 空 已預訂,已入住,臟房間等狀態public RoomStatus Status { get; set; }/// <summary>/// 旅館/// </summary>public virtual Hotel Hotel { get; set; }}

很明顯的可以看出,上述模型不是DDD中的領域對象模型。

3.結論:ORM中的Model不應該與DDD中的DomainModel等價

更多的:我們在設計數據庫表的時候,為了查詢性能考慮,會冗余一些信息等等。

通過以上的分析,我們可以得出結論:ORM中的Model不應該與DDD中的DomainModel等價。

我藉著本文來拋磚引玉。

國外的大牛寫的:Just-Stop-It!-The-Domain-Model-Is-Not-The-Persistence-Model.aspx

轉載于:https://www.cnblogs.com/zhengqzheng/p/5883612.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基礎總結

Unsafe Java線程池 HashCode 垃圾收集 關于引用&#xff08;弱引用、強引用等等&#xff09;轉載于:https://www.cnblogs.com/aquariusm/p/6340303.html

jsp java語法_JSP基礎語法

Java JSP 的 JSP基礎語法在本章中&#xff0c;我們將了解和學習JSP語法。并了解JSP開發涉及的簡單語法(即元素)的基本用法。為了方便演示&#xff0c;使用Eclipse創建一個動態Web項目&#xff1a;jspsyntax&#xff0c;用于運行以下涉及到的示例代碼。JSP的元素JSP的元素如下所…

iOS - Core Animation 核心動畫

1、UIView 動畫 具體講解見 iOS - UIView 動畫2、UIImageView 動畫 具體講解見 iOS - UIImageView 動畫3、CADisplayLink 定時器 具體講解見 iOS - OC NSTimer 定時器CADisplayLink 是一個能讓我們以和屏幕刷新率相同的頻率將內容畫到屏幕上的定時器。我們在應用中創建一個新的…

navicat 官方使用手冊,中文版,快捷鍵大全

2017年1月23日09:52:51 這個官方中文文檔很詳細 https://www.navicat.com.cn/manual/online_manual/cn/navicat/win_manual/index.html https://community.navicat.com/videos/cn 官方中文論壇部分視頻教程 快捷鍵 Navicat 主窗口 鍵動作CTRLG設置位置文件夾CTRL#&#xff08;#…

Linux inode與文件系統關系

inode只有在linux文件系統的概念&#xff08;ext3,ext4) 、inode節點數量與文件存儲的關系。 二、在文件系統初始化時設置合適的節點數量。 linux服務器在存儲文件小而數量多的情況下&#xff0c;需要考慮inode用完的情況。轉載于:https://www.cnblogs.com/lirunzhou/p/5883706…

評分系統 java_C自動評分系統

我無法按照規范完成作業 . 這是分配方案&#xff1a;大學迫切需要一個自動測試評分系統 . 使用C&#xff0c;為大學寫一個評分系統&#xff0c;并對至少五名學生的測試進行評分 . 要創建評分系統&#xff0c;請按照以下步驟操作&#xff1a;首先詢問測試中的問題數量然后詢問每…

當Terraform遇上ECS(一)——DataSource篇

背景 越來越多的公司已經熟知并運用“基礎設施即代碼”來構建和維護自己的云基礎設施。目前也有許多的自動化構建工具協助用戶通過腳本進行云資源的部署和生命周期的管理&#xff0c;如&#xff1a;Terraform、Ansible、Chef等。但是&#xff0c;在實施過程中&#xff0c;都遇到…

【BZOJ 1597】 [Usaco2008 Mar]土地購買 (斜率優化)

1597: [Usaco2008 Mar]土地購買 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322Description 農夫John準備擴大他的農場,他正在考慮N (1 < N < 50,000) 塊長方形的土地. 每塊土地的長寬滿足(1 < 寬 < 1,000,000; 1 < 長 < 1,000,000). …

深入淺出學java_《深入淺出學JAVA開發初級》

整體說明&#xff1a;Java私塾的這一套視頻是完全真實課堂錄制&#xff0c;實際上課時間為十一天&#xff0c;主要內容包括&#xff1a;1&#xff1a;系統完整的學習Java的基礎知識2&#xff1a;深入剖析重點知識點的理論3&#xff1a;超多的編程題目和程序講解4&#xff1a;最…

重定位與鏈接腳本

1.為什么需要重定位   位置無關編碼(PIC&#xff0c;position independent code)&#xff1a;匯編源文件被編碼成二進制可執行程序時編碼方式與位置&#xff08;內存地址&#xff09;無關。  位置有關編碼&#xff1a;匯編源碼編碼成二進制可執行程序后和內存地址是有關的。…

Linux bashrc和profile的用途和區別

導讀使用終端ssh登錄Linux操作系統的控制臺后&#xff0c;會出現一個提示符號&#xff08;例如&#xff1a;#或~&#xff09;&#xff0c;在這個提示符號之后可以輸入命令&#xff0c;Linux根據輸入的命令會做回應&#xff0c;這一連串的動作是由一個所謂的Shell來做處理。Shel…

python讀取word文檔結構圖_Word 有什么技巧,讓你相見恨晚?

Word作為日常辦公最常用的軟件之一&#xff0c;其實真沒你想得那么簡單&#xff01;你不知道的每一個技巧&#xff0c;都會讓你相見恨晚&#xff01;每當身邊的小伙伴詢問這些疑難雜癥時&#xff0c;我都會拋出這張圖…真的沒騙你&#xff0c;我們遇到的 99% 的Word難題&#x…

Golang 特性簡介

by sheepbao 主要大概介紹go語言的歷史和特性&#xff0c;簡單的入門。 來歷 很久以前&#xff0c;有一個IT公司&#xff0c;這公司有個傳統&#xff0c;允許員工擁有20%自由時間來開發實驗性項目。在2007的某一天&#xff0c;公司的幾個大牛&#xff0c;正在用c開發一些比較繁…

HTML實體字符轉化為HTML標簽

html_entity_decode方法 參數描述string必需。規定要解碼的字符串。flags 可選。規定如何處理引號以及使用哪種文檔類型。 可用的引號類型&#xff1a; ENT_COMPAT - 默認。僅解碼雙引號。ENT_QUOTES - 解碼雙引號和單引號。ENT_NOQUOTES - 不解碼任何引號。規定所使用文檔類型…

華為2017java筆試題_2017年java華為面試題

2017年java華為面試題通過HCNP認證&#xff0c;將證明您對中小型網絡有全面深入的了解&#xff0c;掌握中小型網絡的通用技術&#xff0c;并具備獨立設計中小型網絡以及使用華為路由交換設備實施設計的能力。下面是小編收集的關于java華為面試題&#xff0c;希望大家認真閱讀!1…

Tomcat 配置詳解/優化方案

Server.xml 【原地址&#xff1a;http://blog.csdn.net/cicada688/article/details/14451541】 Server.xml配置文件用于對整個容器進行相關的配置。 <Server>元素&#xff1a;是整個配置文件的根元素。表示整個Catalina容器。 屬性&#xff1a;className&#xff1a;實現…

MySQL創建數據庫與創建用戶以及授權

1、create schema [數據庫名稱] default character set utf8 collate utf8_general_ci;--創建數據庫 采用create schema和create database創建數據庫的效果一樣。 2、create user [用戶名稱]% identified by [用戶密碼];--創建用戶 密碼8位以上&#xff0c;包括&#xff1a;大寫…

java 防止url重復請求_Web項目如何防止客戶端重復發送請求

在Web項目中&#xff0c;有一些請求或操作會對數據產生影響(比如新增、刪除、更新)&#xff0c;針對這類請求一般都需要做一些保護&#xff0c;以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。本文總結了一些防止客戶端重復發送請求的方法。方法一&#xff1a;JS監聽…

【bzoj1010-toy】斜率優化入門模板

dsy1010: [HNOI2008]玩具裝箱 【題目描述】 有n個數&#xff0c;分成連續的若干段&#xff0c;每段&#xff08;假設從第j個到第i個組成一段&#xff09;的分數為 (X-L)^2&#xff0c;X為j-iSigma(Ck) i<k<j&#xff0c;其中L是一個常量。目標&#xff1a;各段分數的總和…