Rafy 框架 - 時間戳插件

img

本文將解釋 Rafy 框架中的時間戳插件的場景、使用方法、原理。git

場景

在開發各種數據庫應用系統時,業務領域實體每每須要包含「建立時間」、「最後更新時間」、「建立人」、「最後更新人」等跟蹤戳屬性。這些屬性是領域實體的基本屬性,幾乎全部的領域業務操做都會使用到這些屬性,如:建立業務數據確定會保存建立時間、建立人;更新業務數據須要記錄最後更新時間;查詢業務數據須要顯示建立人等。github

時間戳插件能夠自動在數據層維護這些屬性,使開發人員專一與業務邏輯開發,減小業務無關基本操做所佔用的時間。數據庫

使用方法

開發人員在業務領域實體實現時間戳功能時,只須要引用該插件。引用後系統中全部實體都會自動添加時間戳屬性,同時倉庫中全部數據庫操做都會增長時間戳屬性。框架

步驟ide

  1. 經過 Nuget Package Manager 搜索並安裝 Rafy.Domain.Stamp 插件。
    插件

  2. 在 DomainApp 中添加該插件:
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 用戶手冊》中。

相關文章
相關標籤/搜索