Ich bin ein Anfänger mit Dapper und ich habe einige Zweifel über Best Practices. Mein Projekt ist ein Asp.net WebApi.
Verbindungszeichenfolge öffnen
In diesem Thread wird die Verbindung zur Datenbank innerhalb des Controllers geöffnet, aber es ist ein einfaches Projekt, das kein WebService sein soll:
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
Aber ich fand andere Beispiele mit using
Aussage:
using (IDbConnection connection = new SqlConnection(stringConnection))
{
//do something
}
Da dieses Projekt ist ein WebAPI die Anweisung using besser wäre cu'z es würde Dispose
die Anfrage?
Daten auflisten
Im selben Thread oben zeigt, wie Sie eine Liste basierend auf der static IDbConnection db
:
var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
Oder wäre es besser, .AsList()
?
var res = connection.Query<ShippDetails>(query, new { id }).AsList();
Die Aktion des Controllers
Für alle meine Action geht es so:
[Route("FF")]
[HttpGet]
public async Task<HttpResponseMessage> get()
{
var response = new HttpResponseMessage();
int id = 1;
var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
if (res.Count > 0)
{
response = Request.CreateResponse(HttpStatusCode.OK, res);
}
else
{
response = Request.CreateResponse(HttpStatusCode.NoContent);
}
var task = new TaskCompletionSource<HttpResponseMessage>();
task.SetResult(response);
return await task.Task;
}
Es könnte irgendeine Art von Verzögerung verursachen? Oder die Art, wie ich mit meiner Aktion umgehe, ist "gut"? Vielen Dank!
Die Verwendung using
block ist immer die beste Vorgehensweise. Dies ist jedoch möglicherweise nicht in allen Fällen zutreffend. Wenn Sie WebApi verwenden, sollten Sie UnitOfWork verwenden, wenn Ihre Transaktion auf mehrere Klassen oder Methoden verteilt ist. Lesen Sie diese Antwort für das Codebeispiel, nur für den Fall, dass Sie interessiert sind.
using
IDisposable
nur das Objekt IDisposable
, das IDisposable
implementiert IDisposable
. In Ihrem Fall eine Datenbankverbindung. Es verfügt nicht über die Anfrage.
Über Ihre zweite Frage sollte AsList()
eine gute Übung sein .
Über "Action of the Controller" ist es nicht gut oder schlecht. Ich sehe keinen Grund, hier eine Verzögerung zu verursachen.
SqlConnection
basiert auf einem Pool interner Verbindungen. Wenn Sie sie erstellen und entsorgen, gelangen Sie aus dem Pool und kehren in den Pool zurück, es sei denn, es sind nicht genügend Verbindungen vorhanden, z. B. die ersten Verbindungen.
Also sollten Sie die using
mit SqlConnection
. Es ist tatsächlich gefährlich, eine statische Variable zu verwenden, um eine Verbindung zu halten, da die Instanzmethoden einer Verbindung nicht über mehrere Threads hinweg funktionieren.
Wie bei den Daten, die Sie mit Dapper erhalten, .AsList()
die Übertragung der Ergebnisse. Es ist eine klare Aussage von "Ich will die Ergebnisse in Erinnerung". Wenn Sie es nicht verwenden, erhalten Sie möglicherweise ein IEnumerable<T>
das jede Zeile faul erhält.
In Bezug auf Ihren Controller werfen Sie das Ergebnis von Query<T>
auf List<T>
. Dies funktioniert möglicherweise nicht, Sie sollten sich an .AsList()
. Eine andere Sache ist, dass Sie keinen Nutzen von async
in Ihrem Controller nehmen. Was Sie var res = await db.QueryAsync<T>(...).AsList();
sollten ist var res = await db.QueryAsync<T>(...).AsList();
und einfach return response;
Am Ende ist die TaskCompletionSource<T>
dort überflüssig.