1. 程式人生 > >ABP(現代ASP.NET樣板開發框架)系列之10、ABP領域層——實體

ABP(現代ASP.NET樣板開發框架)系列之10、ABP領域層——實體

基於DDD的現代ASP.NET開發框架--ABP系列之10、ABP領域層——實體

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。

本文由深圳-Carl提供翻譯

實體是DDD(領域驅動設計)的核心概念之一。Eric Evans是這樣描述的“很多物件不是通過它們的屬性定義的,而是通過一連串的連續性事件和標識定義的”(引用領域驅動設計一書)。

譯者注:物件不是通過它們的屬性來下根本性的定義,而應該是通過它的線性連續性和標識性定義的。。所以,實體是具有唯一標識的ID且儲存在資料庫中。實體通常被對映成資料庫中的一個表。

實體類(Entity classes) 

在ABP中,實體繼承自Entity類,請看下面示例:

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

    public virtual DateTime CreationTime { get; set; }

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

Person 類被定義為一個實體。它具有兩個屬性,它的父類中有Id屬性。Id是該實體的主鍵。所以,Id是所有繼承自Entity類的實體的主鍵(所有實體的主鍵都是Id欄位)。

Id(主鍵)資料型別可以被更改。預設是int(int32)型別。如果你想給Id定義其它型別,你應該像下面示例一樣來宣告Id的型別。

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

    public virtual DateTime CreationTime { get; set; }

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

你可以設定為string,Guid或者其它資料型別。

實體類重寫了 equality (==) 操作符用來判斷兩個實體物件是否相等(兩個實體的Id是否相等)。還定義了一個IsTransient()方法來檢測實體是否有Id屬性。

介面約定

在很多應用程式中,很多實體具有像CreationTime的屬性(資料庫表也有該欄位)用來指示該實體是什麼時候被建立的。APB提供了一些有用的介面來實現這些類似的功能。也就是說,為這些實現了這些介面的實體,提供了一個通用的編碼方式(通俗的說只要實現指定的介面就能實現指定的功能)。

(1)審計(Auditing)

實體類實現 IHasCreationTime 介面就可以具有CreationTime的屬性。當該實體被插入到資料庫時, ABP會自動設定該屬性的值為當前時間。

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 Task()
    {
        CreationTime = DateTime.Now;
    }
}

ICreationAudited 擴充套件自 IHasCreationTime 並且該介面具有屬性 CreatorUserId :

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

當儲存一個新的實體時,ABP會自動設定CreatorUserId 的屬性值為當前使用者的Id

你可以輕鬆的實現ICreationAudited介面,通過派生自實體類 CreationAuditedEntity (因為該類已經實現了ICreationAudited介面,我們可以直接繼承CreationAuditedEntity 類就實現了上述功能)。它有一個實現不同ID資料型別的泛型版本(預設是int),可以為ID(Entity類中的ID)賦予不同的資料型別。
下面是一個為實現類似修改功能的介面

public interface IModificationAudited
{
    DateTime? LastModificationTime { get; set; }
    long? LastModifierUserId { get; set; }
}

當更新一個實體時,APB會自動設定這些屬性的值。你只需要在你的實體類裡面實現這些屬性。

如果你想實現所有的審計屬性,你可以直接擴充套件 IAudited 介面;示例如下:

public interface IAudited : ICreationAudited, IModificationAudited
{
        
}

作為一個快速開發方式,你可以直接派生自AuditedEntity 類,不需要再去實現IAudited介面(AuditedEntity 類已經實現了該功能,直接繼承該類就可以實現上述功能),AuditedEntity 類有一個實現不同ID資料型別的泛型版本(預設是int),可以為ID(Entity類中的ID)賦予不同的資料型別。

(2)軟刪除(Soft delete)

軟刪除是一個通用的模式被用來標記一個已經被刪除的實體,而不是實際從資料庫中刪除記錄。例如:你可能不想從資料庫中硬刪除一條使用者記錄,因為它被許多其它的表所關聯。為了實現軟刪除的目的我們可以實現該介面 ISoftDelete:

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

ABP實現了開箱即用的軟刪除模式。當一個實現了軟刪除的實體正在被被刪除,ABP會察覺到這個動作,並且阻止其刪除,設定IsDeleted 屬性值為true並且更新資料庫中的實體。也就是說,被軟刪除的記錄不可以從資料庫中檢索出,ABP會為我們自動過濾軟刪除的記錄。(例如:Select查詢,這裡指通過ABP查詢,不是通過資料庫中的查詢分析器查詢。)

如果你用了軟刪除,你有可能也想實現這個功能,就是記錄誰刪除了這個實體。要實現該功能你可以實現IDeletionAudited 介面,請看下面示例:

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

正如你所看到的IDeletionAudited 擴充套件自 ISoftDelete介面。當一個實體被刪除的時候ABP會自動的為這些屬性設定值。
如果你想為實體類擴充套件所有的審計介面(例如:建立(creation),修改(modification)和刪除(deletion)),你可以直接實現IFullAudited介面,因為該介面已經繼承了這些介面,請看下面示例:

public interface IFullAudited : IAudited, IDeletionAudited
{
        
}

作為一個快捷方式,你可以直接從FullAuditedEntity 類派生你的實體類,因為該類已經實現了IFullAudited介面。

注意:所有的審計介面和類都有一個泛型模板為了導航定義屬性到你的User 實體(例如:ICreationAudited<TUser>和FullAuditedEntity<TPrimaryKey, TUser>),這裡的TUser指的進行建立,修改和刪除的使用者的實體類的型別,詳細請看原始碼(Abp.Domain.Entities.Auditing空間下的FullAuditedEntity<TPrimaryKey, TUser>類),TprimaryKey 只的是Entity基類Id型別,預設是int。

(3)啟用狀態/閒置狀態(Active/Passive)

有些實體需要被標記為啟用狀態或者閒置狀態。那麼你可以為實體採取active/passive狀態的行動。基於這個原因而建立的實體,你可以擴充套件IPassivable 介面來實現該功能。該介面定義了IsActive 的屬性。

如果你首次建立的實體被標記為啟用狀態,你可以在建構函式設定IsActive屬性值為true。

這是不同於軟刪除(IsDeleted)。如果實體被軟刪除,它不能從資料庫中被檢索到(ABP已經過濾了軟刪除記錄)。但是對於啟用狀態/閒置狀態的實體,你完全取決於你怎樣去獲取這些被標記了的實體。

IEntity介面

事實上Entity 實現了IEntity 介面(和Entity<TPrimaryKey> 實現了 IEntity<TPrimaryKey>介面)。如果你不想從Entity 類派生,你能直接的實現這些介面。其他實體類也可以實現相應的介面。但是不建議你用這種方式。除非你有一個很好的理由不從Entity 類派生。

希望更多國內的架構師能關注到ABP這個專案,也許這其中有能幫助到您的地方,也許有您的參與,這個專案可以發展得更好。

歡迎加ABP架構設計交流QQ群:134710707

ABP架構設計交流群

相關推薦

ABP(現代ASP.NET樣板開發框架)系列10ABP領域——實體

基於DDD的現代ASP.NET開發框架--ABP系列之10、ABP領域層——實體 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由深圳-Carl提供翻譯 實體是DDD(領域驅動設計)的核心概念之一。Eric Eva

ABP(現代ASP.NET樣板開發框架)系列4ABP模組系統

基於DDD的現代ASP.NET開發框架--ABP系列之4、ABP模組系統 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由東莞-天道提供翻譯  ABP模組系統簡介 ABP框架提供了建立和組裝模組的基礎,一個模組

ABP(現代ASP.NET樣板開發框架)系列6ABP依賴注入

基於DDD的現代ASP.NET開發框架--ABP系列之6、ABP依賴注入 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由 上海-半冷 提供翻譯 什麼是依賴注入 如果你已經知道依賴注入的概念,建構函式和屬性注入

ABP(現代ASP.NET樣板開發框架)系列9ABP設定管理

基於DDD的現代ASP.NET開發框架--ABP系列之9、ABP設定管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由山東-李偉提供翻譯 介紹 每個應用程式需要儲存一些設定並在應用程式的某個地方使用這些設定。

ABP(現代ASP.NET樣板開發框架)系列2ABP入門教程

基於DDD的現代ASP.NET開發框架--ABP系列之2、ABP入門教程 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的

ABP(現代ASP.NET樣板開發框架)系列17ABP應用——引數有效性驗證

基於DDD的現代ASP.NET開發框架--ABP系列之17、ABP應用層——引數有效性驗證 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 應用程式的輸入資料首先應該被檢驗是否有效。輸入的資料能被使用者或其他應用程式提

ABP(現代ASP.NET樣板開發框架)系列16ABP應用——資料傳輸物件(DTOs)

基於DDD的現代ASP.NET開發框架--ABP系列之16、ABP應用層——資料傳輸物件(DTOs) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 資料傳輸物件(Data Transfer Objects)用於應用層

ABP(現代ASP.NET樣板開發框架)系列13ABP領域——資料過濾器(Data filters)

基於DDD的現代ASP.NET開發框架--ABP系列之13、ABP領域層——資料過濾器(Data filters) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 介紹 在資料庫開發中,我們一般會運用軟刪除(soft

ABP(現代ASP.NET樣板開發框架)系列21ABP展現——Javascript函式庫

基於DDD的現代ASP.NET開發框架--ABP系列之21、ABP展現層——Javascript函式庫 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate的js庫提供了一些讓java

ABP(現代ASP.NET樣板開發框架)系列14ABP領域——領域事件(Domain events)

基於DDD的現代ASP.NET開發框架--ABP系列之14、ABP領域層——領域事件(Domain events) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 在C#中,一個類可以定義其專屬的事件並且其它類可以註冊該事

ABP(現代ASP.NET樣板開發框架)系列5ABP啟動配置

基於DDD的現代ASP.NET開發框架--ABP系列之5、ABP啟動配置 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。  本文由 東莞-天道 提供翻譯 譯者注:在看這一節的內容之前,建議大家先下載module-ze

ABP(現代ASP.NET樣板開發框架)系列3ABP分層架構

基於DDD的現代ASP.NET開發框架--ABP系列之3、ABP分層架構 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 前言 為了減少複雜性和提高程式碼的可重用性,採用分層架構是一種被廣泛接受的技術。為了實現分層的

ABP(現代ASP.NET樣板開發框架)系列19ABP應用——審計日誌

基於DDD的現代ASP.NET開發框架--ABP系列之19、ABP應用層——審計日誌 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 維基百科定義:審計跟蹤(也稱為稽核日誌)是一個安全相關的時間順序記錄,記錄這些記錄的

ABP(現代ASP.NET樣板開發框架)系列15ABP應用——應用服務(Application services)

基於DDD的現代ASP.NET開發框架--ABP系列之15、ABP應用層——應用服務(Application services) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由東莞-天道提供翻譯 應用服務用於將領

ABP(現代ASP.NET樣板開發框架)系列23ABP展現——異常處理

基於DDD的現代ASP.NET開發框架--ABP系列之23、ABP展現層——異常處理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 在 web 應用程式中,異常通常是在 MVC Controller actions

ABP(現代ASP.NET樣板開發框架)系列8ABP日誌管理

基於DDD的現代ASP.NET開發框架--ABP系列之8、ABP日誌管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 本文由東莞-天道提供翻譯 Server side(伺服器端) ASP.NET Boilerpla

ABP(現代ASP.NET樣板開發框架)系列1ABP總體介紹

基於DDD的現代ASP.NET開發框架--ABP系列之1、ABP總體介紹 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程式的新起點,它旨在成為一個通用的

ABP(現代ASP.NET樣板開發框架)系列12ABP領域——工作單元(Unit Of work)

基於DDD的現代ASP.NET開發框架--ABP系列之12、ABP領域層——工作單元(Unit Of work) ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 通用連線和事務管理方法 連線和事務管理是使用資料庫的應用程

ABP(現代ASP.NET樣板開發框架)系列22ABP展現——導航欄設定

基於DDD的現代ASP.NET開發框架--ABP系列之22、ABP展現層——導航欄設定 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 每一個WEB應用程式都有導航選單,Abp也為使用者提供了通用的建立和顯示選單方式。

ABP(現代ASP.NET樣板開發框架)系列7ABP Session管理

基於DDD的現代ASP.NET開發框架--ABP系列之7、ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板專案)”的簡稱。 簡介 如果一個應用程式需要登入,則它必須知道當前使用者執行了什麼操作。因此ASP.