2017-02-27 3 views
1

Heute versuche ich, ein abstraktes Basis-Repository mit einigen grundlegenden CRUD-Funktionen zu erstellen, die von DapperExtensions vorgeschlagen werden. Der als Beispiel angegebene Code verwendet jedoch eine SqlConnection, die zum Herstellen einer Verbindung mit einer SQL Server-Datenbank verwendet wird. Ich möchte in der Lage sein, eine Verbindung zu allen Arten von Datenbanken (SQL Server, MySql, etc ...) herzustellen. Auch wird ihr Codebeispiel für jede CRUD Funktion wiederholt, wie der Code unten zeigtErstellen Sie einen DbContext, der eine DatabaseFactory behandelt, um DapperExtensions einfacher zu verwenden

using (SqlConnection cn = new SqlConnection(_connectionString)) 
{ 
    cn.Open(); 
    //Code doing something here... 
    cn.Close(); 
} 

Also ich darüber nachdachte, einen DbContext zu schaffen, das die Erzeugung verarbeiten kann, das Öffnen und Schließen der Verbindung und auch erstellen kann das richtige Verbindungsobjekt, abhängig von dem Datenbanktyp, den ich verwenden möchte (eine Art Datenbank-Factory).

Gibt es jemanden, der es bereits getan hat und seinen Code teilen konnte?

Danke Jungs!

+0

Es klingt wie Sie versuchen, die Möglichkeiten eines echten ORM zu bauen. Haben Sie sowohl Entity Framework als auch NHibernate ausprobiert und durch umfangreiches, empirisches Benchmarking festgestellt, dass beide für Ihre Anwendung einfach zu langsam sind, weil Sie aufgrund der unglaublichen Beliebtheit Ihres Services Millionen von Datensätzen und extrem hohem Traffic haben? –

Antwort

0

Sie verwenden Dapper-Extensions; folgender Code ist nur mit Dapper. Aber es ändert nicht das gesamte Konzept. Nur statt sql müssen Sie poco übergeben.

Siehe this Antwort für wie ich implementiert IUnitOfWork und DalSession. Im unteren Code ist BaseDal genau wie BaseRepository.

public abstract class BaseDal 
{ 
    internal BaseDal(IUnitOfWork unitOfWork) 
    { 
     dapperHandler = new DapperHandler(unitOfWork); 
    } 

    DapperHandler dapperHandler = null; 

    protected T Get<T>(string sql, DynamicParameters param) where T : class 
    { 
     var result = dapperHandler.Query<T>(sql, param).FirstOrDefault(); 
     return result; 
    } 

    protected List<T> GetList<T>(string sql, DynamicParameters param) where T : class 
    { 
     var result = dapperHandler.Query<T>(sql, param).ToList(); 
     return result; 
    } 

    protected int Insert(string sql, DynamicParameters param) 
    { 
     var result = dapperHandler.Execute(sql, param); 
     return result; 
    } 
} 

Edit 1 Zum Beispiel Code mit Dapper-Erweiterungen finden this Antwort, die ich vor kurzem veröffentlicht.

0
public abstract class ABaseRepository<M> : IBaseRepository<M> 
     where M : BaseModel 
    { 
     private static DbProviderFactory factory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ProviderName); 
     protected static DbConnection connection; 

    public static IDbConnection CreateOpenConnection() 
    { 
     connection = factory.CreateConnection(); 
     connection.Open(); 

     return connection; 
    } 

    public dynamic Insert(M model) 
    { 
     dynamic multiKey; 
     using (IDbConnection con = CreateOpenConnection()) 
     { 
      multiKey = con.Insert(model); 
     } 

     return multiKey; 
    } 
} 
Verwandte Themen