差異

0

當實現使用小巧玲瓏的ORM庫模式,我目前做如下:差異

private readonly ConnectionStrings _connectionStrings; 
private IDbConnection _db; 

public CustomerRepository(IOptions<ConnectionStrings> connectionStrings) 
{ 
    _connectionStrings = connectionStrings.Value; 
    _db = new SqlConnection(_connectionStrings.DefaultConnection); 
} 

public Customer Find(int id) 
{ 
    return this._db.Query<Customer>("SELECT * FROM Contacts WHERE Id = @Id", new { id }).SingleOrDefault(); 
} 

可有人請告訴我是否應該這樣做,或者如果我應該在每個存儲庫函數中使用帶有新SqlConnection的using語句。

我假設我的上面的代碼需要類似UnitOfWork的東西才能生效嗎?而且在完成運行所有需要的存儲庫功能時,也可以採用某種方式處理連接。

+3

在每種方法中使用'using'語句。不要重用連接或任何ADO.NET對象。 [相關](http://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren/9707060#9707060) –

+1

使用'using'語句。 – stuartd

+0

感謝球員,但你能解釋爲什麼我看到一些例子,如何時使用EF,通過依賴注入傳入上下文,然後使用?還有可能通過幾個使用語句來實現UnitOfWork?我正在考慮使用以下方法:https://github.com/timschreiber/DapperUnitOfWork –

回答

1

推薦的方法是使用using語句。用戶paulwhit解釋他們的使用大有this答案:

的原因「使用」的聲明是要確保,因爲它超出範圍的對象,一旦配置,並且它不需要明確的代碼確保發生這種情況。

在你的方法using語句和具有連接是一個類成員之間的本質區別在於,using聲明可以確保一旦你與你的操作完成,並已退出該塊,您的連接關閉並妥善處理。這消除了開發人員可能出現的任何錯誤,並且通常使得所有的事情都更加簡潔。

在這種情況下,using聲明的一個重要的額外好處是它可以確保連接被處置,即使存在異常(儘管值得注意的是,這不是嚴格意義上的唯一方法) 。根據documentation

using語句確保即使在對象上調用方法時發生異常,也會調用Dispose。

如果您想讓連接成爲類成員,那麼導致您的程序早退出的方法中間的未處理異常可能會使連接處於打開狀態。這當然不是一件好事。

所以總結一下,除非你有一個很好的理由不去,那就去using聲明吧。

1

通常,當一個類型實現IDisposable(並且因此與using作品)可以有時是包裝在另一種類型的有用的,其具有其它類型也實現IDisposable和具有其Dispose()呼叫被包裝的對象,並然後使用using(或其他機制調用Dispose())。

問題是這是否是有時是之一。

不是。特別需要注意的是,SqlConnection在後臺實現了池化,因此(除非您明確選擇退出連接字符串)而不是Dispose()關閉到服務器的整個連接實際上發生的是組件內部的一個對象,該對象處理內存爲SqlConnection下一次打開具有相同連接字符串的SqlConnection時,將連接的詳細信息放入池中以再次使用。

這意味着您的應用程序將通過SqlConnection類的許多用途儘可能少地使用連接。但是,你要阻止通過儘可能不返回游泳池的方式保持游泳池外的連接。

+0

因此,您似乎在說:每個函數的使用語句並不是那麼糟糕。如果我需要在交易中批量處理多個報表,該怎麼辦?是否可以在存儲庫或多個存儲庫中調用3個獨立的函數,並讓它們全部在事務中運行?似乎每個函數都有一個using語句會很困難。 –

+1

不,我要進一步說每個函數的使用語句都很棒!雖然交易是一個不同的問題,但我不得不承認,我並不關心池化機制是否是事務感知的,因此它是否仍能正常工作。 –