該應用的領域很簡單,有**Product**和**Category**兩個實體以及一個**ProductStockState**枚舉,如圖所示:

實體在解決方案的領域層中定義,它分為兩個項目:
* **.Domain**用于定義您的實體、值對象、領域服務、存儲庫接口和其他與領域相關的核心類。
* **.Domain.Shared**用于定義一些可用于其他層的共享類型。通常,我們在這里定義枚舉和一些常量。
## 產品類別實體(Category)
`Category`實體用于對產品進行分類。*在ProductManagement.Domain*項目中創建一個*Categories*文件夾,并在其中創建一個`Category`類:
```
using System;
using Volo.Abp.Domain.Entities.Auditing;
namespace ProductManagement.Categories
{
????public class Category : AuditedAggregateRoot<Guid>
????{
????????public string Name { get; set; }
????}
}
```
`Category`類派生自`AuditedAggregateRoot<Guid>`,這里`Guid`是實體的主鍵 (`Id`) 。您可以使用任何類型的主鍵(例如`int`、`long`或`string`)。
`AggregateRoot`是一種特殊的實體,用于創建聚合的根實體。它是一個**領域驅動設計**(**DDD**) 概念,我們將在接下來的章節中更詳細地討論。
相比`AggregateRoot`類,`AuditedAggregateRoot`添加了更多屬性:`CreationTime`、、`CreatorId`、`LastModificationTime`和`LastModifierId`。
當您將實體插入數據庫時??,ABP 會自動給這些屬性賦值,`CreationTime`會設置為當前時間,`CreatorId`會自動設置為當前用戶的`Id`屬性。
**關于充血領域模型**
在本章中,我們使用公共的 getter 和 setter 來保持實體的簡單性。如果您想創建更豐富的領域模型并應用 DDD 原則和其他最佳實踐,我們將在接下來的章節中討論它們。
## 產品庫存狀態枚舉(ProductStockState)
`ProductStockState`是一個簡單的枚舉,用來設置和跟蹤產品庫存。
我們在\*.Domain.Shared*項目中創建一個*Products\*文件夾和一個枚舉`ProductStockState`:
```
namespace ProductManagement.Products
{
????public enum ProductStockState : byte
????{
????????PreOrder,
????????InStock,
????????NotAvailable,
????????Stopped
????}
}
```
我們將在**數據傳輸對象(DTO)** 和界面層復用該枚舉。
## 產品實體(Product)
在.Domain項目中創建一個*Products*文件夾,并在其中創建一個類`Product`:
```
using System;
using Volo.Abp.Domain.Entities.Auditing;
using ProductManagement.Categories;
namespace ProductManagement.Products
{
????public class Product : FullAuditedAggregateRoot<Guid>
????{
????????public Category Category { get; set; }
????????public Guid CategoryId { get; set; }
????????public string Name { get; set; }
????????public float Price { get; set; }
????????public bool IsFreeCargo { get; set; }
????????public DateTime ReleaseDate { get; set; }
????????public ProductStockState StockState { get; set; }
????}
}
```
這一次,我繼承自`FullAuditedAggregateRoot`,相比`Category`d的`AuditedAggregateRoot`類,它還增加了`IsDeleted`、`DeletionTime`和`DeleterId`屬性。
`FullAuditedAggregateRoot`實現了`ISoftDelete`接口,用于實體的**軟刪除**。即它永遠不會從數據庫中做物理刪除,而只是標記為已刪除。ABP 會自動處理所有的軟刪除邏輯。包括下次查詢時,已刪除的實體會被自動過濾,除非您有意請求它們,否則它不會在查詢結果中顯示。
>[success] 注:數據過濾系統詳情將在\[*第 8 章*\] 進行深入介紹。
## 導航屬性
在這個例子中,`Product.Category`是一個導航屬性為`Category`的實體。如果您使用 MongoDB 或想要真正實現 DDD,則不應將導航屬性添加到其他聚合中。但是,對于關系數據庫,它可以完美運行并為我們的代碼提供靈活性。
解決方案中的新文件如圖所示:

我們已經創建了領域對象。接下來是常量值。
## 常量值
這些常量將在輸入驗證和數據庫映射階段進行使用。
首先,在.Domain.Shared項目中創建一個 *Categories* 文件夾并在里面添加一個類`CategoryConsts`:
```
namespace ProductManagement.Categories
{
????public static class CategoryConsts
????{
????????public const int MaxNameLength = 128;
????}
}
```
在這里,`MaxNameLength`值將用于`Category`的`Name`屬性的約束。
然后,在.Domain.Shard的 *Products* 文件夾中創建一個`ProductConsts`類:
```
namespace ProductManagement.Products
{
????public static class ProductConsts
????{
????????public const int MaxNameLength = 128;
????}
}
```
該`MaxNameLength`值將用于約束`Product`的`Name`屬性。

現在,領域層已經完成定義,接下來將為 EF Core 配置數據庫映射。
- 前言
- 第一部分
- 第1章 現代軟件開發和 ABP 框架
- 企業級 Web 開發的挑戰
- ABP框架的能力清單
- 第2章 ABP框架入門
- 安裝 ABP CLI
- 創建新解決方案
- 運行解決方案
- 探索預構建模塊
- 第3章 逐步開發開發ABP應用
- 創建解決方案
- 定義領域對象
- EFCore和數據庫映射
- 定義應用服務
- 測試產品
- 產品列表
- 創建產品
- 編輯產品
- 刪除產品
- 第4章 探索 EventHub解決方案
- 應用介紹
- 架構探索
- 方案運行
- 第二部分
- 第5章 探索ABP基礎架構
- 了解模塊化
- 使用依賴注入系統
- 配置應用程序
- 實現選項模式
- 日志系統
- 第6章 數據訪問基礎架構
- 定義實體
- 定義倉儲庫
- EF Core集成
- 了解 UoW
- 第7章 探索橫切關注點
- 認證授權
- 用戶驗證
- 異常處理
- 第8章 體驗 ABP 的功能和服務
- 獲取當前用戶
- 使用數據過濾
- 控制審計日志
- 緩存數據
- 本地化用戶界面
- 第三部分
- 第9章 理解領域驅動設計
- 介紹 DDD
- 構建基于 DDD 的 解決方案
- 處理多個應用程序
- 了解執行流程
- DDD的通用原則
- 第10章 領域層 Domain
- 領域事件案例分析
- 聚合和實體的設計原則和實踐
- 實現領域服務
- 落地存儲庫
- 構建規約(Specification)
- 領域事件
- 第11章 應用層 Application
- 落地應用服務
- 設計 DTO
- 理解各層的職責
- 第四部分
- 第12章 MVC/Razor 頁面
- 主題系統
- 綁定和壓縮
- 導航菜單
- Bootstrap標簽助手
- 創建表單并驗證
- 使用模態窗口
- 使用JS API
- 調用HTTP API
- 第13章 Blazor WebAssembly UI
- 什么是Blazor
- ABP Blazor UI
- 驗證用戶身份
- 理解主題系統
- 使用菜單
- 使用基本服務
- 使用UI服務
- 消費HTTP API
- 使用全局腳本和樣式
- 第14章 HTTP API 和實時服務
- 構建HTTP API
- 使用HTTP API
- 使用SignalR
- 第五部分
- 第15章 落地模塊化
- 理解模塊化
- 構建支付模塊
- 安裝模塊
- 第16章 實現多租戶
- 理解多租戶
- 多租戶基礎設施
- 使用功能系統
- 何時使用多租戶
- 第17章 構建自動化測試
- 了解ABP測試基礎設施
- 構建單元測試
- 構建集成測試