領域?qū)?br />實體是DDD(領域驅(qū)動設計)的核心概念之一。Eric Evans是這樣描述的“很多對象不是通過它們的屬性定義的,而是通過一連串的連續(xù)性事件和標識定義的”(引用領域驅(qū)動設計一書)。
譯者注:對象不是通過它們的屬性來下根本性的定義,而應該是通過它的線性連續(xù)性和標識性定義的。。所以,實體是具有唯一標識的ID且存儲在數(shù)據(jù)庫中。實體通常被映射成數(shù)據(jù)庫中的一個表。
實體類(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(主鍵)數(shù)據(jù)類型可以被更改。默認是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或者其它數(shù)據(jù)類型。
實體類重寫了 equality (==) 操作符用來判斷兩個實體對象是否相等(兩個實體的Id是否相等)。還定義了一個IsTransient()方法來檢測實體是否有Id屬性。
接口約定
在很多應用程序中,很多實體具有像CreationTime的屬性(數(shù)據(jù)庫表也有該字段)用來指示該實體是什么時候被創(chuàng)建的。APB提供了一些有用的接口來實現(xiàn)這些類似的功能。也就是說,為這些實現(xiàn)了這些接口的實體,提供了一個通用的編碼方式(通俗的說只要實現(xiàn)指定的接口就能實現(xiàn)指定的功能)。
(1)審計(Auditing)
實體類實現(xiàn) IHasCreationTime 接口就可以具有CreationTime的屬性。當該實體被插入到數(shù)據(jù)庫時, ABP會自動設置該屬性的值為當前時間。
public interface IHasCreationTime{ DateTime CreationTime { get; set; }}Person類可以被重寫像下面示例一樣實現(xiàn)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
新聞熱點
疑難解答
圖片精選