2016-07-19 6 views
1

in meinem DAL mit Dapper ich viele sich wiederholende Code haben:Wie abstrakt (mit Func?) Teil der Funktion

using (var sqlConn = new NpgsqlConnection("...")) 
{ 
    sqlConn.Open(); 
    // query 
} 

Herauszufinden, wie abstrakte Anfragen an die Rückkehr nichts war einfach:

private void OpenConn(Action<NpgsqlConnection> action) 
    { 
     using (var sqlConn = new NpgsqlConnection("...") 
     { 
      sqlConn.Open(); 
      action.Invoke(sqlConn); 
     } 
    } 

Und Sie nennen es einfach so:

OpenConn(x => x.Execute("INSERT INTO ...")); 

Aber ich habe keine Ahnung, wie OpenConn Funktion neu zu schreiben, so dass Sie RETU könnte rn Ergebnisse von ihm, in einer anderen Funktion, dh int zurück:

public int Example() { 
    return OpenConn<int>(x => x.Query<int>("...").First()); 
} 

oder

public int Example() { 
    OpenConn<int>(x => return x.Query<int>("...").First()); 
} 

?

Antwort

3

Vielleicht so etwas wie dieses:

private TResult OpenConn<TResult>(Func<NpgsqlConnection, TResult> query) 
{ 
    using (var sqlConn = new NpgsqlConnection("...") 
    { 
     sqlConn.Open(); 
     return query(sqlConn); 
    } 
} 

Call:

public int Example() 
{ 
    return OpenConn<int>(x => return x.Query<int>("...").First()); 
} 
+0

Dank! dieselbe Antwort wie Steve, aber mit Generika, also als akzeptiert. – Lars

3

eine Überlastung für OpenCON mit dieser Syntax definieren.

OpenConn empfängt jetzt als Parameter einen Delegaten für eine Funktion, die eine Verbindung empfängt und eine ganze Zahl zurückgibt.

Und Sie nennen es das Ergebnis der Anfrage aus OpenCON Rückkehr

public int Example() 
{ 
    int result = OpenConn(x => return x.Query<int>("...").First()); 
}