2016-06-17 3 views
2

オブジェクトの実装に基づいて特定のORMLメソッドを拡張したいと考えています。例えば、クラス・インタフェースに基づくカスタムormlite問合せの実装

私はインターフェイスがあります。

public interface IHaveTimestamps 
{ 
    DateTime CreatedOn { get; set; } 
    DateTime UpdatedOn { get; set; } 
} 

今私はTIHaveTimestampsを実装し、Tの他のインスタンスのために、それはデフォルトの動作に基づいてInsertを実行する必要がある場合にのみ、Db.Insert<T>()メソッドをオーバーライドしたいのですが。

これは私がCreatedOnとUpdatedOnの値を手動で設定するのではなく、どこでも手動で設定できるようにするためです。

Insert/Updateメソッドをオーバーロードしてモデルからインターフェイスを継承し、すべてのDB操作が自動的に処理されるようにするか、何かをする必要があるようにすることができますこのように:

public static class DbExtensions 
{ 
    public static long MyInsert<T> (this IDbConnection dbConn, T obj, bool selectIdentity = false) where T : IHaveTimestamps { 
     obj.CreatedOn = DateTime.UtcNow; 
     obj.UpdatedOn = DateTime.UtcNow; 
     return dbConn.Insert<T>(obj); 
    } 

    public static long MyUpdate<T> (this IDbConnection dbConn, T obj) where T : IHaveTimestamps { 
     obj.UpdatedOn = DateTime.UtcNow; 
     return dbConn.Update<T>(obj); 
    } 
} 

答えて

3

例えば、すでにあなたはこのような何かを行うことができますOrmLite Global Insert/Update Filtersを見てください:

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; 
}; 
+0

これはsoooooooooooスマートです! – labilbe

+0

非常にクール、ありがとう! – vonec

+0

@mythzユーザー/テナントIDによって自動的にフィルタリングされるクエリを実装できるように、これらのフィルタにRequestオブジェクトを挿入することが可能です。 – vonec

関連する問題