2016-06-17 15 views
2

Ich möchte bestimmte ORMLite-Methoden basierend auf der Implementierung des Objekts erweitern. ZBBenutzerdefinierte Ormlite-Abfrage-Implementierung basierend auf Klassenschnittstelle

Ich habe eine Schnittstelle:

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

Nun möchte Ich mag nur die Db.Insert<T>() Methode außer Kraft zu setzen, wenn TIHaveTimestamps implementiert und für andere Fälle von T, sollte es die Insert basierend auf dem Standardverhalten durchführen .

Dies ist so, dass ich die Einstellung CreatedOn und UpdatedOn Werte zentralisieren kann, anstatt das manuell überall zu tun.

Kann ich dies tun, indem Sie die Insert/Update-Methode überladen, so dass ich nur die Modelle aktualisieren muss, um von der Schnittstelle zu erben, und alle DB-Operationen werden sich selbst kümmern, oder würde ich etwas tun müssen wie folgt aus:

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); 
    } 
} 

Antwort

3

Werfen Sie einen Blick auf OrmLite Global Insert/Update Filters, die bereits Sie so etwas wie dies, zum Beispiel erlaubt, zu tun:

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

Dies ist sooooooooooo smart! – labilbe

+0

sehr cool, danke! – vonec

+0

@mythz ist es möglich, das Request-Objekt in diese Filter zu injizieren, so dass ich Abfragen implementieren kann, die automatisch von der Benutzer-/Mandanten-ID – vonec

Verwandte Themen