2017-07-28 2 views
0

Ich bin ein Anfänger mit Dapper und ich habe einige Zweifel über Best Practices. Mein Projekt ist ein Asp.net WebApi.Gute Praktiken mit Dapper

Eröffnung Connection String

In this Gewinde wird die Verbindung mit der Datenbank wie folgt geöffnet, im Inneren des Controllers, aber es ist ein einfaches Projekt, ein WebService, um nicht gemeint:

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 ein WebApi ist, wäre die using-Anweisung besser, weil es die Anforderung Dispose hätte?

Daten Eintrag

Im selben Thread oben zeigt, wie eine Liste abgerufen werden basierend auf static IDbConnection db Eigenschaft:

var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id }); 

Oder wäre besser .AsList() zu benutzen?

var res = connection.Query<ShippDetails>(query, new { id }).AsList(); 

Die Aktion des Controllers

Für alle meine Aktion es geht 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 some kinda von Verzögerung verursachen könnte? Oder die Art, wie ich mit meiner Aktion umgehe, ist "gut"? Vielen Dank!

+0

Sie sollten immer eine Anweisung 'using' mit Objekten verwenden, die' IDisposable' implementieren. Es hat nichts damit zu tun, "die Anfrage zu stellen" oder "gut zu sein", weil es "seine Web-API" ist. – Amy

+0

hab es geschafft! Danke Amy! –

+0

'AsList' wäre besser. – mjwills

Antwort

1

Verwenden Sie using Block ist immer Best Practice. 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. Beantworten Sie die this Antwort für das Codebeispiel nur für den Fall, dass Sie interessiert sind.

using entsorgt nur das Objekt, das implementiert IDisposable; In Ihrem Fall eine Datenbankverbindung. Es verfügt nicht über die Anfrage.

Über Ihre zweite Frage sollte AsList()good practice sein.

Über "Aktion des Controllers" ist es nicht gut oder schlecht. Ich sehe keinen Grund, hier eine Verzögerung zu verursachen.

+0

Danke Amit! Ich werde lesen ! –

2

SqlConnection basiert tatsächlich auf einem Pool interner Verbindungen. Wenn Sie sie erstellen und entsorgen, erhalten Sie also Zugriff auf den Pool und kehren in den Pool zurück, es sei denn, es sind nicht genügend Verbindungen vorhanden, z. die ersten Verbindungen.

Sie sollten also using mit SqlConnection verwenden. 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 für die Daten, die Sie mit Dapper erhalten, wird .AsList() zwingen, die Ergebnisse zu übertragen. Es ist eine klare Aussage von "Ich will die Ergebnisse in Erinnerung".Wenn Sie es nicht verwenden, erhalten Sie möglicherweise eine IEnumerable<T>, die jede Zeile faul erhält.

In Bezug auf Ihren Controller geben Sie das Ergebnis Query<T> an List<T>. Dies funktioniert möglicherweise nicht, Sie sollten sich an .AsList() halten. Eine andere Sache ist, dass Sie keinen Vorteil von async in Ihrem Controller nehmen. Was Sie tun sollten ist var res = await db.QueryAsync<T>(...).AsList(); und einfach return response; am Ende ist die TaskCompletionSource<T> dort überflüssig.

Verwandte Themen