[英]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 。
您可以在ServiceStack中使用ORM(例如NHibernate)。 我個人在ServiceStack項目中使用了Mindscape的名為LightSpeed的ORM,它可以自動處理創建和更新時間戳,而無需任何代碼掛鈎。 如果不適合,使用ServiceStack REST平台並不一定要使用ServiceStack ORM。
正如@Mythz建議的那樣,您可以請求添加此功能 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.