本文將解釋 Rafy 框架中的時間戳插件的場景、使用方法、原理。git
在開發各種數據庫應用系統時,業務領域實體每每須要包含「建立時間」、「最後更新時間」、「建立人」、「最後更新人」等跟蹤戳屬性。這些屬性是領域實體的基本屬性,幾乎全部的領域業務操做都會使用到這些屬性,如:建立業務數據確定會保存建立時間、建立人;更新業務數據須要記錄最後更新時間;查詢業務數據須要顯示建立人等。github
時間戳插件能夠自動在數據層維護這些屬性,使開發人員專一與業務邏輯開發,減小業務無關基本操做所佔用的時間。數據庫
開發人員在業務領域實體實現時間戳功能時,只須要引用該插件。引用後系統中全部實體都會自動添加時間戳屬性,同時倉庫中全部數據庫操做都會增長時間戳屬性。框架
步驟ide
經過 Nuget Package Manager 搜索並安裝 Rafy.Domain.Stamp 插件。
插件
class JXCApp : DomainApp { protected override void InitEnvironment() { //添加時間戳插件到 Rafy 應用程序集中。 RafyEnvironment.DomainPlugins.Add(new Rafy.Domain.Stamp.StampPlugin()); RafyEnvironment.DomainPlugins.Add(new JXCPlugin()); base.InitEnvironment(); } }
添加時間戳插件後,默認全部實體自動註冊時間跟蹤戳屬性。code
通過上面兩步設置,User 實體類就已經開啓了時間戳跟蹤功能,並對實體會有如下的影響:blog
全部繼承自 Entity 的實體都會統一添加四個跟蹤戳字段。
運行程序後,數據庫中的字段,已經自動添加上跟蹤戳字段了:
繼承
INSERT INTO [User] ([CreatedTime],[CreatedUser],[UpdatedTime],[UpdatedUser],[CreateTime],[Name]) VALUES ('2016-07-18 15:14:45','','2016-07-18 15:14:45','','2000-01-01 00:00:00','用戶1')
在用戶已登陸的狀況下,Rafy會從前上下文中獲取當前用戶身份,並給CreatedUser、UpdatedUser字段賦值。開發
在 Rafy 框架的基礎上,以插件的形式對 Rafy 框架中實體的數據層進行了擴展。在Rafy運行環境中加入時間戳插件後,領域中的全部實體默認註冊四個跟蹤戳屬性;同時數據層攔截的提交操做,在添加、更新實體時,設置實體的跟蹤戳。
/// <summary> /// 攔截數據層的提交操做。在添加、更新實體時,設置實體的跟蹤戳。 /// </summary> public class StampSubmitInterceptor : SubmitInterceptor { /// <summary> /// 提交指定的實體,並在添加、更新實體時,設置實體的跟蹤戳。 /// </summary> /// <param name="e">The e.</param> /// <param name="link">The link.</param> protected override void Submit(SubmitArgs e, ISubmitInterceptorLink link) { //... ResetStamp(e); //... } internal static void ResetStamp(SubmitArgs e) { ... switch (e.Action) { //... case SubmitAction.Update: var entity = e.Entity; entity.SetUpdatedTime(DateTime.Now); var user1 = RafyEnvironment.Identity; entity.SetUpdatedUser(user1.Name); break; case SubmitAction.Insert: var entity2 = e.Entity; var now = DateTime.Now; entity2.SetUpdatedTime(now); entity2.SetCreatedTime(now); var user2 = RafyEnvironment.Identity; entity2.SetUpdatedUser(user2.Name); entity2.SetCreatedUser(user2.Name); break; //... } } }
PS:該文已經歸入《Rafy 用戶手冊》中。