ABP官方文档翻译 3.1 实体
實體
- 實體類
- 聚合根類
- 領域事件
- 常規接口
- 審計
- 軟刪除
- 激活/失活實體
- 實體改變事件
- IEntity接口
實體是DDD(領域驅動設計)的核心概念之一。Eric Evans描述它為"An object that is not fundamentally defined by its attributes, but rather by a thread of continuity and identity."所以,實體有Id并存儲在數據庫。實體一般映射到關系庫中的表。
實體類
在ABP,實體繼承自Entity類。如下示例:
public class Person : Entity {public virtual string Name { get; set; }public virtual DateTime CreationTime { get; set; }public Person(){CreationTime = DateTime.Now;} }Persion類定義為實體。它有兩個屬性,實體類還定義了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或其他類型。
實體類重寫了相等運算符(==),可以方便的檢查兩個實體是否相等(Id相同)。實體還定義了IsTransient()方法檢查是否有Id。
聚合根類
“在DDD中,聚合是一種模式。一個DDD聚合是領域對象群集,這些領域對象可以作為一個單元對待。例如訂單和它的行項目,這些是獨立的對象,但是把訂單(和它的行項目)作為一個聚合對待是有用的。”(Martin Fowler -參見詳細描述)。
雖然ABP不強制使用聚合,在應用中,我們或許想創建聚合和聚合根。ABP定義了AggregateRoot類,它擴展了實體為聚合創建聚合根實體。
領域事件
聚合根定義了領域事件集合,通過聚合根類產生領域事件。這些事件在當前工作單元完成之前自動觸發。實際上,任何實體可以通過實現IGeneratesDomainEvents接口來生成領域事件,但是,通常在(最佳實踐)聚合根中生成領域事件。這就是為什么默認為聚合根而不是其他實體類。
常規接口
在許多應用中,相似的實體屬性(和數據庫表字段)被使用,如CreationTime表示實體什么事件被創建。ABP提供了一些有用的接口使這些常見屬性顯示聲明。這也提供了編寫實體常用代碼的一種方式,實現這些接口。
審計
IHasCreationTime使實體擁有一個常用的"creation time"屬性。當實現了這個接口的實體被插入到數據庫時,ABP自動設置CreationTime為當前時間。
public interface IHasCreationTime {DateTime CreationTime { 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接口。AuditedEntity類也有一個泛型版本,以適應不同類型的Id屬性。
注意:ABP從ABP會話中獲取當前用戶Id。
軟刪除
軟刪除是常用的模式,用來標記實體刪除而不是真的從數據庫中刪除。例如,可能不想從數據庫中硬刪除一個用戶,因為它和其他表有許多關系。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; } }IDeletionAudited擴展了ISoftDelete接口。當實體被刪除時,ABP自動記錄這些屬性。
如果想讓實體實現所有的審計接口(creation、modification和deletion),可以直接實現IFullAudited接口,因為它繼承自所有接口:
public interface IFullAudited : IAudited, IDeletionAudited {}有個捷徑,可以使實體繼承自FullAuditedEntity類,它實現了所有。
- NOTE1:所有的審計接口和類都有一個泛型版本,用來定義User實體(如ICreationAudited<TUser>和FullAuditedEntity<TPrimaryKey,TUser>)的導航屬性。
- NOTE2:所有這些都有一個聚合根版本,如AuditedAggregateRoot。
激活/失活實體
一些實體需要被記錄為激活或失活。然后可以基于實體的激活/失活狀態進行操作。可以實現IPassiveable接口,這個接口便是為這個目的設計的。它定義了IsActive屬性。
如果實體第一次創建時為激活狀態,那么可以在構造函數中設置IsActive為true。
這和軟刪除(IsDeleted)是不同的。如果實體被軟刪除,它不能從數據庫中獲取(ABP默認會阻止獲取),但是,對于激活/失活的實體,控制獲取實體完全由自己決定。
實體改變事件
當實體被插入、更新或刪除時,ABP自動觸發這些確定的事件。然后,我們可以注冊這些事件,執行需要的任何邏輯。參見在事件總線文檔的預定義事件部分了解更多信息。
IEntity接口
實際上,Entity類實現了IEntity接口(Entity<TPrimaryKey>實現了IEntity<TPrimaryKey>)。如果不想從Entity類集成,可以直接實現這些接口。其他實體類也有相關的接口。但是,不建議使用這種方式,除非有好的理由不從Entity類繼承。
?
返回主目錄
轉載于:https://www.cnblogs.com/xajh/p/6814894.html
總結
以上是生活随笔為你收集整理的ABP官方文档翻译 3.1 实体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 下安装和配置TSM 7.1
- 下一篇: 前端开发100元/页,空心科技切入IT人