簡體   English   中英

在ServiceStack.OrmLite中可以使用攔截器嗎?

[英]Are interceptors possible in ServiceStack.OrmLite?

我想為OrmLite中的數據庫插入或更新創建一個鈎子。

假設我要為插入到數據庫中的每個記錄編寫一個CreateDate ,並為每個沒有數據庫觸發器或類似事件的更新編寫一個LastUpdateDate 如果用包含新對象和更改對象的anyList調用Db.Save<Anything>(anyList) ,則看不到這樣做的方法。

我知道NHibernate確實提供了攔截器,以便在持久化每個對象之前為它們注入自定義邏輯。 在ServiceStack.OrmLite中有什么方法可以實現這一目標?

我認為這是一個缺少的好功能,因此我剛剛添加了對OrmLite的插入和更新過濾器的支持 因此,現在您可以使用以下命令配置全局更新或插入過濾器:

public interface IAudit
{
    DateTime CreatedDate { get; set; }
    DateTime ModifiedDate { get; set; }
    string ModifiedBy { get; set; }
}

OrmLiteConfig.InsertFilter = (dbCmd, row) =>
{
    var auditRow = row as IAudit;
    if (auditRow != null)
    {
        auditRow.CreatedDate = auditRow.ModifiedDate = DateTime.UtcNow;
    }
};

OrmLiteConfig.UpdateFilter = (dbCmd, row) =>
{
    var auditRow = row as IAudit;
    if (auditRow != null)
    {
        auditRow.ModifiedDate = DateTime.UtcNow;
    }
};

因此,現在將在實現IAudit每一行上更新“創建日期”和“修改日期”字段,並將其插入OrmLite的任何Typed API(即,非動態SQL或使用匿名類型的部分更新),例如:

表定義

public class AuditTableA : IAudit
{
    [AutoIncrement]
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
    public string ModifiedBy { get; set; }
}

public class AuditTableB : IAudit
{
    [AutoIncrement]
    public int Id { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
    public string ModifiedBy { get; set; }
}

var a = new AuditTableA();
var b = new AuditTableB();
db.Save(a);
db.Save(b);

var insertRowA = db.SingleById<AuditTableA>(a.Id);
var insertRowB = db.SingleById<AuditTableB>(b.Id);

//both insertRowA/insertRowB CreatedDate/ModifiedDate fields populated

驗證方式

過濾器還可以用於驗證,如果拋出異常將阻止操作並冒泡該異常,例如:

OrmLiteConfig.InsertFilter = OrmLiteConfig.UpdateFilter = (dbCmd, row) =>
{
    var auditRow = row as IAudit;
    if (auditRow != null)
    {
        if (auditRow.ModifiedBy == null)
            throw new ArgumentNullException("ModifiedBy");
    }
};

try
{
    db.Insert(new AuditTableA());
}
catch (ArgumentNullException) {
   //throws ArgumentNullException
}

db.Insert(new AuditTableA { ModifiedBy = "Me!" }); //succeeds

現在,此功能在ServiceStack的MyGet feed中可用,並且在NuGet的下一v4.0.11 +版本中可用。

在ServiceStack.OrmLite中沒有任何方法可以實現此目的。 如您建議的那樣,該功能僅是較重的ORM(例如NHibernate)的典型功能。

ServiceStack.OrmLite旨在非常輕巧,因此提供了最小的API

API

您可以在ServiceStack中使用ORM(例如NHibernate)。 我個人在ServiceStack項目中使用了Mindscape的名為LightSpeed的ORM,它可以自動處理創建和更新時間戳,而無需任何代碼掛鈎。 如果不適合,使用ServiceStack REST平台並不一定要使用ServiceStack ORM。


正如@Mythz建議的那樣,您可以請求添加此功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM