<<ABP框架>> 實體

来源:http://www.cnblogs.com/kid1412/archive/2016/10/24/5992443.html
-Advertisement-
Play Games

文檔目錄 本節內容: 實體類 聚合根類 領域事件 約定的介面 審計 軟刪除 活躍/消極 實體 實體變化事件 IEntity 介面 領域事件 審計 軟刪除 活躍/消極 實體 實體是DDD一個核心的概念。Eric Evans是這麼描述的:“一個對象根本上不是按它的特性定義的,而是按一個線程的連續性和身份 ...


文檔目錄

 

本節內容:

 

實體是DDD一個核心的概念。Eric Evans是這麼描述的:“一個對象根本上不是按它的特性定義的,而是按一個線程的連續性和身份來定義”。所以實體有一個id屬性存入資料庫中。一個實體通常映射成關係型資料庫的一個表。

 

實體類

在ABP里,實體從Entity類上繼承,示例代碼如下:

public class Person : Entity
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

Person類定義成一個實體,它有兩個屬性,同時Entity類定義了一個Id屬性,它是這個實體的主鍵。所以所有的實體主鍵名都相同,都是Id。

 

Id(主鍵)的類型是可改的,預設是int(Int32)。如果你想把Id定義成其它類型,你應該顯式聲明它,如下所示:

public class Person : Entity<long>
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

同樣,你也可以把它設置成string,Guid或其它類型。

Entity類重寫了equality操作符(==),用它可以非常容易地檢查兩個實體是否相等(它們的Id是否相等),同時也定義了IsTransient()方法檢查實體是否有一個Id。

 

聚合根類

“聚合在DDD里是一個模式,一個DDD聚合是一個領域對象群,可由單獨的單元創建。例如一個訂單和它的項,這些可以是分離的對象,但把訂單(和它的項一起)看成成是一個單獨的聚合是有用的。“(Martin Fowler 查看完整描述)。

雖然ABP沒有強迫你使用聚合,但你也可能想在你的應用里,創建聚合和聚合根。ABP擴展了Entity,定義了AggregateRoot類,為一個聚合創建聚合根實體。

 

領域事件

AggregateRoot定義了DomainEvents集合,通過聚合根對象產生領域事件。這些事件在當前工作單元完成前自動觸發,實質上,任何實體都可以通過實現IGeneratesDomainEvents介面產生領域事件,但通常(最佳實踐)在聚合根里產生領域事件,這就是為什麼把它預設到AggregateRoot里,而不是Entity類里。

 

約定的介面

在很多應用里,有很多相似的實體屬性(資料庫表的欄位),如表示實體何時創建的CreationTime,ABP提供了一些有用的介面,明確和展現這些通用屬性,這也給實現這些介面的實體,在編寫這些屬性代碼時提供了一種通用的方式。

 

審計

IHasCreationTime為一個實體的“創建時間”信息採用通用的屬性,在一個實體插入到資料庫前,ABP自動為實現了該介面的實體,設置CreationTime屬性為當前時間。

public interface IHasCreationTime
{
    DateTime CreationTime { get; set; }
}

Person類改寫成實現IHasCreationTime介面,如下所示:

public class Person : Entity<long>, IHasCreationTime
{
    public virtual string Name { get; set; }

    public virtual DateTime CreationTime { get; set; }

    public Person()
    {
        CreationTime = DateTime.Now;
    }
}

ICreationAudited通過添加CreatorUserId擴展了IhasCreationTime:

public interface ICreationAudited : IHasCreationTime
{
    long? CreatorUserId { get; set; }
}

當保存一個新實體時,ABP自動把CreatorUserId設置為當前用戶的id。你也可以讓你的類繼承CreationAuditedEntity類實現ICreationAudited。它同時也有一個適用於不同類型Id屬性的泛型版本。

也有一個類似的“修改”介面

public interface IHasModificationTime
{
    DateTime? LastModificationTime { get; set; }
}

public interface IModificationAudited : IHasModificationTime
{
    long? LastModifierUserId { get; set; }
}

當更新一個實體時,ABP也自動設置這些屬性。你只需要為你的類定義它們就可以。

如果你想實現所有審計屬性,你可以直接實現IAudited介面:

public interface IAudited : ICreationAudited, IModificationAudited
{

}

更快捷的方式是:你可以繼承AuditedEntity類來代替直接實現IAudited。AuditiedEntity類同樣也有一個適用於不同類型Id屬性的泛型版本。

註意:ABP從ABP會話里獲取用戶Id。

 

軟刪除

軟刪除是一個通用的模式,它把一個實體標記為“已刪除”代替從資料庫直接刪除。例如,你不想把一個User從資料庫硬刪除,因為它可能與其它表有關聯,ISoftDelete介面就是出於這種目的:

public interface ISoftDelete
{
    bool IsDeleted { get; set; }
}

ABP實現了開箱即用模式的軟刪除模式。當一個軟刪除實體開始刪除時,ABP檢測它,阻止它被刪除,設置IsDeleted為true,並把實體更新到資料庫。同時,ABP不會從資料庫獲取(select)軟刪除的實體,會自動過濾它們。

如果你使用軟刪除,當軟刪除一個實體時,你可能也會想保存是誰刪除和什麼時候刪除,你可以實現IDeletionAudited介面,如下所示:

public interface IDeletionAudited : ISoftDelete
{
    long? DeleterUserId { get; set; }

    DateTime? DeletionTime { get; set; }
}

更快捷的方式是:你可以從已經實現了所有的FullAuditedEntity類繼承你的實體。

  • 註意1:所有審計介面和類都有一個為指向你的User實體的導航屬性而設計的泛型版本(如ICreationAudited<TUser>和FullAuditedEntity<TPrimaryKey,TUser>)。
  • 註意2:同時,它們都有一個AggregateRoot版本,如AuditedAggregateRoot。

 

活躍/消極 實體

有些實體需要標記為Active(活躍的)和Passive(消極的),然後你根據實體的活躍/消極狀態採取行動。你可以實現為此目的而生的IPassivable,它定義了IsActive屬性。

如果你的實體想在創建時就是處理活躍狀態,你可以在構造器里設置IsActive為true。

這與軟刪除(IsDeleted)不同,如果一個實體被軟刪除,它就不能再從資料庫里獲取到(ABP預設阻止它),但是是否獲取活躍/消極實體完全取決於你。

 

實體變化事件

當一個實體插入、更新、刪除時,ABP會自動觸發某些事件,因此你可以註冊這些事件執行你需要的任何邏輯。查看事件匯流排文檔的“預定義事件”主題,獲取更多信息。

 

IEntity 介面

實質上,Entity類實現了IEntity介面(且Entity<TPrimaryKey>實現了IEntity<TPrimaryKey>)。如果你不想從Entity類繼承,你可以直接實現這些介面,這些介面對於其它實體類也是適用的,但是這不是推薦的方式,除非你有一個好的理由。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 IO復用技術,簡單來說就是同時監聽多個描述符。在沒有用到IO復用以前,只能是一個線程或一個 線程去監聽,服務端同時有多個連接的時候,需要創建多個線程或者進程。而且,並不是所有的連 接是一直在傳輸這數據,可能只是連接後啥都沒乾,如果這樣,進程就啥都沒乾。 現在有了IO復用技術,只有描述符就緒的時 ...
  • 對於日誌來說,最常見的需求就是收集、存儲、查詢、展示,開源社區正好有相對應的開源項目:logstash(收集)、elasticsearch(存儲+搜索)、kibana(展示),我們將這三個組合起來的技術稱之為ELKStack,所以說ELKStack指的是Elasticsearch、Logstash、 ...
  • hit,命中表示鏈接上這個網站 get獲取表示有更新並且下載, ign忽略表示無更新或者更新無關緊要或者不需要,譬如某些插件系統已經有了或者語言翻譯包 ...
  • 到許可權了。前面講到了 Linux 中的用戶和用戶主管理,其實它們的本質(或者用戶和用戶組出現的初衷)都是方便許可權管理。許可權管理對於電腦的重要性不言而喻,許可權讓每個用戶能夠安安心心的使用電腦,而不用擔心別的用戶破壞到自己的資源。如果老王手裡有一把你家的鑰匙,你是不是很蛋疼呢,如果鄰居除了老王,還有 ...
  • 先安裝字體管理軟體 將需要安裝的字體放到/usr/share/fonts/chinese/目錄下 如果不存在這個目錄,可以自行創建 修改目錄許可權,以便其他用戶也可以使用 應用更改 註意,某些應用可能需要重啟才能生效 使用下麵的命令可以查看已經安裝的字體 ...
  • 從零開始配置ubuntu 14.04,記錄配置服務的過程,安裝組件如下: - SSH - curl - Git - MongoDB - Node.js - ... ...
  • 1.安裝phpStorm,步驟略 2.安裝xampp: 2.1 我下載的版本為:XAMPP 5.6.24(下載最新版裡面沒有xdebug.so文件) 照步驟安裝。 2.2 安裝成功後,啟動一下,看看是否可以運行,在瀏覽器地址欄輸入localhost,查看是否可以進入到xampp網站 。 2.3 點擊 ...
  • 嗬!沒想到吧!學習 Linux 的第三天,我們已經開始接觸用戶管理,用戶組管理,以及許可權管理這幾個逼格滿滿的關鍵字。這幾個關鍵字對於前端程式猿的我來說真的是很高大上有木有,以前嘗試學 Linux 的時候看到這些名詞總是下意識的跳過不敢看有木有,一提起這幾個名詞馬上腦海中總是升騰起無限的崇拜有木有!今 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...