<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                該應用的領域很簡單,有**Product**和**Category**兩個實體以及一個**ProductStockState**枚舉,如圖所示: ![](https://img.kancloud.cn/18/13/1813193476712abfb7275e8dd4bdc076_1141x604.png) 實體在解決方案的領域層中定義,它分為兩個項目: * **.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,則不應將導航屬性添加到其他聚合中。但是,對于關系數據庫,它可以完美運行并為我們的代碼提供靈活性。 解決方案中的新文件如圖所示: ![](https://img.kancloud.cn/d9/61/d9612e3f89845452ddd70682abd3c252_512x666.png) 我們已經創建了領域對象。接下來是常量值。 ## 常量值 這些常量將在輸入驗證和數據庫映射階段進行使用。 首先,在.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`屬性。 ![](https://img.kancloud.cn/89/58/89588d0ff4f4ba2f7ae7b1648279b044_246x165.png) 現在,領域層已經完成定義,接下來將為 EF Core 配置數據庫映射。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看