2017-07-28 34 views
0

我是一名初學者,對於最佳實踐有些懷疑。我的項目是一個Asp.net WebApi。Dapper的最佳實踐

開放連接字符串

this線程與數據庫的連接打開這個樣子,控制器裏面,但它是一個簡單的項目,並不意味着是一個WebService:

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString); 

但我發現其他的例子有using聲明:

using (IDbConnection connection = new SqlConnection(stringConnection)) 
{ 
    //do something 
} 

因爲這個項目是一個WebApi的使用聲明會更好cu'z它會Dispose的要求?

清單數據

在同一個線程上面顯示瞭如何基於static IDbConnection db屬性檢索列表:

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

或將要更好地使用.AsList()

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

控制器

我所有的行動不言而喻等的作用:

[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; 
    } 

這可能會導致一些還挺延誤?或者我處理我的行動的方式是「好」?謝謝!

+0

你應該總是使用'using'語句和實現'IDisposable'的對象。它與「處理請求」無關,或者因爲「它的web API」而變得很好。 – Amy

+0

明白了!謝謝艾米! –

+0

'AsList'會更好。 – mjwills

回答

1

使用using塊總是最佳實踐。但這可能並不適用於所有情況。在使用WebApi時,如果您的事務分散在多個類或方法中,請考慮使用UnitOfWork。如果您有興趣,請參考this解答代碼示例。

using只配置實施的對象IDisposable;在你的情況下,一個數據庫連接。它不處理請求。

關於你的第二個問題,AsList()應該是good practice

關於「控制器的動作」,它不好還是不好。我沒有看到任何推遲的原因。

+0

謝謝阿米特!我會讀! –

2

SqlConnection實際上是基於一個內部連接池,因此當您創建並處理它們時,除非沒有足夠的連接時,您纔會從池中取出並返回池。第一個連接。

所以,你應該使用usingSqlConnection。使用靜態變量來保持連接實際上很危險,因爲連接的實例方法不能保證在多個線程中工作。

至於你用Dapper得到的數據,.AsList()會強制轉移結果。這是「我想要記憶中的結果」的明確表述。如果你不使用它,你可能會得到一個IEnumerable<T>,它懶惰地獲得每一行。

關於您的控制器,您要將Query<T>的結果轉換爲List<T>。這可能行不通,你應該堅持.AsList()。另一件事是,你實際上沒有在你的控制器中獲得async的任何好處。你應該在var res = await db.QueryAsync<T>(...).AsList();return response;最後,TaskCompletionSource<T>是多餘的那裏。