В статье о реализации хранилища с 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();
}
}
Dapper проверит, открыто ли соединение, и при необходимости вызовите 'Open', но я согласен с тем, что было бы лучше создать новое соединение в' using' каждый раз. – juharr
Замечание: если вы используете 'AsList()' dapper', а не 'ToList()', вы избежите выделения списка –