2017-06-01 3 views
0

J'ai une classe de référentiel générique dapper, puisque .net core ne supporte pas les transactions distribuées J'ai décidé d'envoyer un objet connexion déjà ouvert à la méthode générique au lieu de l'injecter séparément dans le référentiel.Membre/classe statique pour référentiel générique

public class Repository<T> where T: class 
{ 
    protected readonly IComplianceConnection Connection; 

    public Repository(IComplianceConnection connection) 
    { 
     Connection = connection; 
    } 

    public IEnumerable<T> Get(string query, object arguments) 
    { 
     IList<T> entities; 

     using (var connection = Connection.OpenConnection()) 
     { 
      entities = connection.Query<T>(query, arguments, commandType: CommandType.StoredProcedure).ToList(); 
     } 

     return entities; 
    } 
} 

Je dois changer cela en classe statique .below est le nouveau référentiel.

public static class Repository<T> where T: class 
{ 

    public static IEnumerable<T> Get(this IDbConnection connection, string query, object arguments) 
    { 
     IList<T> entities; 


      entities = connection.Query<T>(query, arguments, commandType: CommandType.StoredProcedure).ToList(); 


     return entities; 
    } 
} 

Cette méthode statique pour le référentiel générique est-elle correcte? ..Pls me suggèrent

+0

1. Je ne pense pas que l'utilisation est "appropriée" peut-être que la connexion est déjà établie ??. 2. Pourquoi vous ne mettez pas cette méthode sur DbContext? – Max

+0

Peut-on fournir un exemple de code – Ljt

Répondre

1

Ma compréhension est que les méthodes d'extension agissent sur une instance d'une classe. Dans votre méthode Get(), cette instance est le paramètre de connexion. Cependant, il semble que vous écrasez l'instance de connexion dans votre méthode Get(). Ceci peut ne pas être désiré.

Vous ne souhaitez probablement pas créer de méthode d'extension. Peut-être que vous voulez juste une méthode statique qui peut accepter un paramètre IComplianceConnection.

public static IEnumerable<T> Get(IComplianceConnection complianceConnection, string query, object arguments) 
{ 
    IList<T> entities; 
    using (var connection = complianceConnection.OpenConnection()) 
    { 
     entities = connection.Query<T>(query, arguments, commandType: CommandType.StoredProcedure).ToList(); 
    } 
    return entities; 
} 

Espérons que cela aide!