2016-03-07 1 views
0

В статье о реализации хранилища с Dapper (Using Dapper.NET ORM...), есть следующий код:При использовании шаблона репозитория с Dapper необходимо ли открывать и закрывать соединения db?

public class UserRepository : IUserRepository 
{ 
    private IDbConnection _db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); 
    public List<User> GetAll() 
    { 
     return this._db.Query<User>("SELECT * FROM Users").ToList(); 
    } 

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

    public User Add(User user) 
    { 
     var sqlQuery = "INSERT INTO Users (FirstName, LastName, Email) VALUES(@FirstName, @LastName, @Email); " + "SELECT CAST(SCOPE_IDENTITY() as int)"; 
     var userId = this._db.Query<int>(sqlQuery, user).Single(); 
     user.UserID = userId; 
     return user; 
    } 
} 

Что касается частного IDbConnection, почему не это никогда не открываются или закрываются в отдельных методах? Я видел это в другом месте. Есть ли какой-нибудь сахар вокруг этого рисунка? Мой инстинкт состоит в том, чтобы обернуть каждое возвращение при использовании, а затем _db.Open(); как показано ниже, но, опять же, я видел, что это не делается в нескольких других ссылках в Интернете.

public List<User> GetAll() 
{ 
    using (_db) //or (IDbConnection _db = new SqlConnection(myConnectionString)) 
    { 
     _db.Open(); 
     return this._db.Query<User>("SELECT * FROM Users").ToList(); 
    } 
} 
+0

Dapper проверит, открыто ли соединение, и при необходимости вызовите 'Open', но я согласен с тем, что было бы лучше создать новое соединение в' using' каждый раз. – juharr

+1

Замечание: если вы используете 'AsList()' dapper', а не 'ToList()', вы избежите выделения списка –

ответ

3

Dapper действительно откроется и закроется автоматически, если обнаружит закрытое соединение. Поэтому, если вы не хотите делать этот бит: он все равно должен работать нормально. Главным недостатком этого может быть то, что вы не можете легко сэкономить транзакцию по закрытому соединению, поэтому, если вы намерены использовать транзакции на уровне соединения, лучше начать с встроенного управления жизненным циклом соединения.