<<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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...