2016-06-17 1 views
2

je voudrais étendre certaines méthodes de ORMLite basées sur la mise en œuvre de l'objet. Par exemple,mise en œuvre de requête personnalisée ormlite basée sur l'interface de classe

J'ai une interface:

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

J'aimerais maintenant remplacer la méthode Db.Insert<T>() que si T implémente IHaveTimestamps et pour d'autres cas de T, il faut effectuer la Insert en fonction du comportement par défaut .

Il en est ainsi que je peux centraliser la définition des valeurs CreatedOn et UpdatedOn, plutôt que de faire que partout manuellement. Puis-je le faire en surchargeant la méthode Insert/Update de sorte que tout ce que je devrais faire est de mettre à jour les modèles à hériter de l'interface et toutes les opérations de la DB prendront soin de lui-même, ou devrais-je faire quelque chose? comme ceci:

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

Répondre

3

Jetez un oeil à OrmLite Global Insert/Update Filters qui déjà vous permet de faire quelque chose comme ceci, par exemple:

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

C'est sooooooooooo intelligent! – labilbe

+0

très cool, merci! – vonec

+0

@mythz est-il possible d'injecter l'objet de demande dans ces filtres afin que je puisse implémenter des requêtes qui sont automatiquement filtrés par l'utilisateur/locataire Id – vonec