ABP理論學習之實體類

2021-09-07 04:29:52 字數 3641 閱讀 8439

返回總目錄

ientity介面

實體是ddd(領域驅動設計)的核心概念之一。eirc evans是這樣描述的實體的:「它根本上不是通過屬性定義的,而是通過一系列連續性和標識定義的」。因此,實體都有id屬性並且都儲存到資料庫中。乙個實體一般會對映到資料庫的一張表。

在abp中,實體派生自entity類,看下面的例子:

public class person : entity

public virtual datetime creationtime

public person()

}

上面定義了乙個person實體類,而且在entity類中定義了乙個id屬性,它是該entity類的主鍵。因此,所有實體的主鍵名都是相同的,都是id

id(主鍵)的型別是可以改變的,預設是int(int32)的。如果你想將id定義為其他型別,可以像下面那樣顯示宣告:

public class person : entity

public virtual datetime creationtime

public person()

}

而且,你也可以把它設定為string,guid或其他型別的。

entity類重寫了等號運算子(==),可以輕鬆地檢查兩個實體是否相同了(實體的id相同則認為它們相同)。它也定義了istransient方法來檢測它是否有id。

在許多應用中,使用了相似的實體屬性(和資料表中的字段),如creationtime表明該實體是何時建立的。abp提供了很多有用的介面來使得這些通用的屬性變得明確並富有表現力。此外,這也為實現了這些介面的實體類提供了一種編寫通用**的方式。

審計ihascreationtime使得使用乙個通用的屬性來描述乙個實體的「建立時間」資訊成為可能。當實現了該介面的實體類插入到資料庫中時,abp會自動地將當前的時間設定給creationtime。

public inte***ce ihascreationtime

}

person類可以通過實現ihascreationtime介面來重寫,如下所示:

public class person : entity, ihascreationtime

public virtual datetime creationtime

public person()

}

icreationaudited通過增加了creatoruserid擴充套件了ihascreationtime:

public inte***ce icreationaudited : ihascreationtime

}

當儲存乙個新的實體時,abp會自動地將當前的使用者id設定為creatoruserid。

你也可以通過從creationauditedentity類派生實體,從而輕易地實現icreationaudited。

對於修改也有相似的介面:

public inte***ce imodificationaudited

long? lastmodifieruserid

}

當更新乙個實體的時候,abp也會自動地設定這些屬性。你只需要為你的實體實現這些介面即可。

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

public inte***ce iaudited : icreationaudited, imodificationaudited

作為乙個快捷方式,你可以從auditedentity類派生,而不需要直接實現iaudited。auditedentity類對於不同型別的id屬性也有泛型的版本。

軟刪除軟刪除是將乙個實體標記為已刪除的通常使用的模式,而不是直接從資料庫中刪除。比如,你可能不想從資料庫中硬刪除乙個user,因為它可能關聯其他的表。isoftdelete介面用於下面的目的:

public inte***ce isoftdelete

}

abp實現了開箱即用的軟刪除模式。當乙個軟刪除實體被刪除後,abp檢測到之後,會阻止刪除,將isdeleted設定為true並更新資料庫中的實體。而且,它會自動地過濾資料庫中軟刪除的實體,不會檢索(select)它們。

如果使用了軟刪除,那麼你可能想儲存一些資訊,比如何時刪除以及誰刪除了乙個實體等等。你可以實現下面演示的ideletionaudited介面:

public inte***ce ideletionaudited : isoftdelete

datetime? deletiontime

}

ideletionaudited擴充套件了isoftdelete,當刪除乙個實體時,abp會自動設定這些屬性。

如果你想為乙個實體實現所有的審計介面(建立,修改和刪除),那麼可以直接實現ifullaudited,因為它繼承了所有的這些介面:

public inte***ce ifullaudited : iaudited, ideletionaudited

同樣的,作為乙個快捷方式,你可以從fullauditedentity類派生你的實體類從而實現所有的審計介面。

注意:所有的審計介面和類都有乙個定義導航屬性到user實體的泛型版本(比如icreationaudited和fullauditedentity)。

啟用/未啟用

一些實體需要標記為啟用的或未啟用的。這樣,你就可以根據實體的啟用或者未啟用狀態來採取行動。你可以實現ipassivable介面來達到目的。該介面定義了isactive屬性。

如果實體在第一次建立時是啟用的,那麼你可以在建構函式中將isactive設定為true。

這與軟刪除(isdeleted)是不同的。如果乙個實體是軟刪除的,那麼它就不會從資料庫中檢索到了(abp缺省會阻止),但是,對於啟用或者未啟用的實體,控制獲取實體完全取決於你。

實際上,entity類實現了ientity介面(且entity實現了ientity)。如果不想從entity類中派生,那麼可以直接實現這些介面。但是,除非你有乙個好的原因不從entity類派生,否則,不建議這麼做。

ABP理論學習之Abp Session

返回總目錄 當應用程式要求使用者登入時,那麼應用程式也需要知道當前使用者正在執行的操作。雖然asp.net本身在展現層提供了session物件,但abp也提供了在任何需要獲得當前使用者和租戶的地方都可以使用的iabpsession介面。關於iabpsession 為了獲得實際的session資訊,必...

ABP理論學習之開篇介紹

返回總目錄 為了和2016年春節賽跑,完成該系列部落格,我犧牲了今天中午的時間來完成該系列的第一篇 開篇介紹。開篇介紹嘛,讀過大學教材的同學都知道,這玩意總是那麼無聊,跟考試沒關係,乾脆直接跳過,呵呵,多麼美好的大學時光啊!不過,現在想想,開篇介紹確實不怎麼重要,它只是告訴我們今後我要開始講什麼了,...

ABP理論學習之Nuget包

返回總目錄 abp已經發布在nuget上,這裡是所有包的列表。abp abp系統的核心包。所有其他的包都依賴這個包。abp.web 提供了mvc和web api都使用的一些通用類和資源 abp.web.resource web層的資源 js,css.檔案 abp.web.mvc 提供一些asp.ne...