2016-06-01 7 views
0

Hintergrund zu verwenden:Wie Dapper dot net zwingen, seine Umsetzung von IDbCommand.ExecuteReader

ich dabei bin Dapper in eine bestehende Anwendung zu integrieren, die ein Vermächtnis DAL aus der DAAB von Jahren vergangen basierend hat . Dies ist eine ziemlich große Codebasis, daher muss sie inkrementell durchgeführt werden. Mein erster Versuch ist eine Methode, die einen Reader aufruft und eine Sammlung von Objekten bevölkert.

Was ich bemerke, ist, dass die Abfrageerweiterungsmethode scheinbar den IDbCommand.ExecuteReader aufruft und die ältere DAL-Implementierung anstelle der Dapper-Version aufgerufen wird.

Also meine Frage ist dies "Gibt es eine Möglichkeit, Dapper ausdrücklich zu zwingen, seine Implementierung von IDbCommand.ExecuteReader und nicht die ältere Version zu verwenden?"

Setup-Verbindung: Die offene Verbindung kommt aus dem vorhandenen Framework und es wickelt vollständig die IDbConnection-Schnittstelle und einige. Es gibt eine Menge Sicherheit, um diese Verbindung zu bekommen, und andere Zusätze, die das Wasser trüben.

private static XyDbConnection GetConnection() 
{ 
    return XyDbConnection.GetConnection(ExternalFieldDataConstants.ConnectionName.SecureRepositoryConnection); 
} 

Callsite: Nichts schrecklich hier geht gerade Einrichtung von Dapper in einem typischen Szenario

private void GetFieldMappingTableDapper() 
{ 
    const string commandText = @" 
     SELECT 
      OD.ObjectDefId, 
      OD.Name, 
      FM.LOBField, 
      FM.XPath, 
      FM.XPathDataType, 
      FM.legacyOnly, 
      BA.NAME BusinessAreaName 
     FROM [FieldMapping] FM 
     JOIN [ObjectDef] OD 
     ON OD.ObjectDefId = FM.ObjectDefId 
     JOIN [BusinessArea] BA 
     ON BA.BusinessAreaId = OD.BusinessAreaId"; 

    using (var conn = GetConnection()) 
    { 
     _mappingsCache = conn.Query<FieldMappingEx>(commandText).ToList(); 
    } 
} 

Bilder sagen mehr als tausend Worte.

den Anruf einrichten Dapper: enter image description here

Nun, wenn ich (F11) in den Aufruf Schritt erhalte ich: enter image description here

Und nun der interessanteste Teil der Aufruf des Legacy-Befehlsobjekt ist von Dapper. (es scheint) enter image description here

Ich habe Dapper seit Jahren verwendet, sogar mit Oracle :) und das ist das erste Mal, dass ich jemals einen Hickup hatte, Zeitraum.

Danke, Stephen

+1

Können Sie zeigen, welchen Code Sie anrufen? auch, was ist der Verbindungstyp hier? Ist es möglich, dass der Verbindungsanbieter hier etwas Verrücktes macht? Nein: Dapper kann nicht in Ihre bestehende DAL anrufen, also eine von: die falsche Methode wird an erster Stelle aufgerufen, oder die Verbindung macht etwas Verrücktes, oder was gerade passiert passiert an einem anderen Ort :) –

+3

Zum Beispiel: dapper * hat kein * IDbCommand.ExecuteReader'; Es hat eine 'IDbConnection.ExecuteReader' Methode. Wenn Ihr Stammobjekt ein Befehl ist: Sie verwenden Dapper nicht an erster Stelle. –

+1

Sie können nicht kompilieren, wenn Sie mehrdeutige Erweiterungsmethoden haben, also ist es nicht möglich, dass eine andere Methode Ihre beabsichtigte Verwendung der Dapper-Erweiterungsmethode, fyi, übertrumpft. – Graham

Antwort

1

Ja, adrett die CreateCommand Methode auf der Verbindung aufruft. Es muss. Es weiß nichts darüber, welche Art von Verbindung Sie verwenden. Das ist wörtlich die einzige Möglichkeit, sollte (als provider-agnostic Bibliothek) einen Befehl erstellen. Gibt es eine andere Art, wie Sie erwartet haben, dass ein ado.net-Befehl erstellt wird?

+0

Nein, die Codierung gegen die Schnittstelle ist das, was Sie tun sollen. Ich muss entweder ein allgemeineres Verbindungsobjekt ohne das Gepäck schaffen oder die alte DAL und die neue DAL trennen, so dass ich diese Probleme nicht haben werde. Danke für die schnelle Antwort Marc. –

+1

@Stephen das Decorator-Muster funktioniert ganz gut in ado.net, wenn Sie brauchen - so können Sie einen grundlegenden Anbieter haben, den Sie dann in einen aufgemotzten Anbieter wickeln - geben Sie einfach dapper den grundlegenden "Schwanz". Siehe Mini-Profiler für ein Beispiel (ProfiledDbConnection) –

+0

Wie wäre es mit dem Undecorator-Muster, das ist, was ich brauche ... Ich versuche nur, diese Leute aus der .NET 2.0-Ära zu holen. –

Verwandte Themen