2017-06-01 4 views
0

Ich habe Dapper generische Repository-Klasse, da .net-Core keine verteilte Transaktion unterstützt Ich habe beschlossen, bereits geöffnetes Verbindungsobjekt an generische Methode zu senden statt separat in das Repository zu injizieren.Statischer Member/Klasse für generisches Repository

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

Ich muss dies in statische Klasse ändern. Unter ist das neue Repository.

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

Ist diese statische Methode für das generische Repository korrekt? ..Pls suggerate me

+0

1. Ich glaube nicht, dass die Verwendung "geeignet" ist, vielleicht ist die Verbindung bereits etabliert? 2. Warum setzen Sie diese Methode nicht auf DbContext? – Max

+0

Können Sie einen Beispielcode bereitstellen – Ljt

Antwort

1

Mein Verständnis ist, dass Erweiterungsmethoden auf eine Instanz einer Klasse wirken. In Ihrer Methode Get() ist diese Instanz der Verbindungsparameter. Es scheint jedoch so, als ob Sie die Verbindungsinstanz in Ihrer Methode Get() überschreiben. Dies kann nicht erwünscht sein.

Wahrscheinlich möchten Sie keine Erweiterungsmethode erstellen. Vielleicht möchten Sie nur eine statische Methode, die einen IComplianceConnection-Parameter akzeptiert.

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

Hoffe, das hilft!

Verwandte Themen