天天看點

.NET Core開發實戰(第27課:定義Entity:區分領域模型的内在邏輯和外在行為)--學習筆記

上一節講到領域模型分為兩層

一層是抽象層,定義了公共的接口和類

另一層就是領域模型的定義層

先看一下抽象層的定義

1、實體接口 IEntity

通常情況下實體隻有一個 ID,但是也不排除存在多個 ID 的情況,是以這裡的接口 IEntity 定義實作為多個 ID 的情況,而 IEntity 表示實體隻有一個 Id

同樣看一下 Entity 的定義

同樣地定義了一個 Entity 和 Entity,這樣就可以在實體上面定義一些共享的方法,比如 ToString

對于 Entity 定義了比較多的方法

2、聚合根接口 IAggregateRoot

聚合根接口實際上是一個空接口,它不實作任何的方法,它的作用是在實作倉儲層的時候,讓一個倉儲對應一個聚合根

3、領域事件接口 IDomainEvent

4、域事件處理接口 IDomainEventHandler

5、還有一個領域模型裡面比較關鍵的值對象 ValueObject

值對象的定義比較特殊,因為它是沒有 Id 的,是以沒有關于 Id 的定義,并且沒有對值對象定義接口

重點實作了它是否相等的判斷,也是重載了 Equals 這個方法和 GetHashCode 這個方法

它有一個特殊的抽象方法的定義,擷取它的原子值

這個方法的作用是将值對象的字段輸出出來,作為唯一辨別來判斷兩個對象是否相等,可以看到 Equals 的定義裡面也是調用了擷取原子值這個方法來判斷它是否相等

接下來看一下定義的 Order 實體

它首先實作了 Entity,這一個在上一節已經講過,另外一個 Order 定義為一個聚合根,它需要實作聚合根接口 IAggregateRoot

實體中字段的 set 設定為 private,這樣的好處是 Order 所有的資料的操作都應該由實體負責,而不應該被外部對象去操作,進而讓領域模型符合封閉開放的原則

對于領域模型的操作,都應該是定義具有業務邏輯含義的方法來定義

比如說 ChangeAddress,就定義一個 ChangeAddress 的方法,把新的位址傳進來,由領域模型負責指派

這裡面就可以添加一些位址的校驗,比如新的位址是否能夠與舊的位址距離太遠

看一下位址的定義

隻能通過構造函數給值對象指派,這裡面需要注意的是重載了擷取原子值的方法,使用了 yield return

總結一下

在定義領域模型的時候,首先領域模型的字段的修改應該設定為私有的

使用構造函數來表示對象的建立,它的初始值都是由構造函數的參數來指派的

另外需要定義有業務含義的動作來操作模型的字段

領域模型隻負責自己資料的處理,領域服務或者指令負責調用領域模型的業務動作

樣就可以區分領域模型的内在邏輯和外在邏輯,使代碼結構更加合理

GitHub源碼連結:

https://github.com/witskeeper/geektime

.NET Core開發實戰(第27課:定義Entity:區分領域模型的内在邏輯和外在行為)--學習筆記
.NET Core開發實戰(第27課:定義Entity:區分領域模型的内在邏輯和外在行為)--學習筆記
.NET Core開發實戰(第27課:定義Entity:區分領域模型的内在邏輯和外在行為)--學習筆記

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。

歡迎轉載、使用、重新釋出,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。

如有任何疑問,請與我聯系 ([email protected]) 。