ASP.NET MVC Управление SQLConnection с помощью Dapper

Я даю новый Dapper Micro ORM, выпущенный Stack Overflow/Sam Saffron, быстро используя MVC. Мне интересно, как проще всего управлять объектом SQLConnection внутри моего контроллера? Я делаю что-то простое, как это, просто чтобы просмотреть некоторые данные и протестировать Dapper, но стоит ли открывать/закрывать соединение таким образом?

public class HomeController : Controller
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ajh"].ConnectionString);

    public HomeController()
    {
    }

    public ActionResult Index()
    {
        // get me all comments
        conn.Open();
        var comments = conn.ExecuteMapperQuery<Comment>("select * from Comment");
        conn.Close();

        return View(comments);
    }
}

person aherrick    schedule 19.04.2011    source источник


Ответы (2)


Просто создайте, откройте и закройте соединение как можно локальнее:

public class HomeController : Controller
{
    public HomeController()
    {
    }

    public ActionResult Index()
    {
        List<Comment> comments;
        using (var conn = new SqlConnection(/* ... */))
        {
            conn.Open();
            comments = conn.ExecuteMapperQuery<Comment>("select * from Comment");
        }
        return View(comments);
    }
}

Хотя лучше всего избегать прямого доступа к данным в ваших контроллерах. Спрячьте свои методы доступа к данным в класс CommentsService или аналогичный и вызовите его из своего контроллера.

person LukeH    schedule 19.04.2011
comment
Люк спасибо за ответ. Я просто думаю, что очень маленькое приложение CRUD должно быть максимально простым. - person aherrick; 19.04.2011
comment
@aherrick: Достаточно честно, я бы, наверное, сделал то же самое. Если код действительно такой простой, то добавление дополнительных слоев и абстракций часто только ухудшает, а не улучшает ситуацию! - person LukeH; 19.04.2011

Я никогда не использовал его, но var comments откладывается в его выполнении, тогда у вас возникнет проблема, и вам придется использовать что-то вроде .ToList для полного перечисления результатов перед закрытием соединения. В противном случае, если .ExecuteMapperQuery полностью перечислит результаты перед их возвратом, все будет в порядке.

person Joel Martinez    schedule 19.04.2011
comment
Спасибо за ответ. Да, он полностью перечисляет и возвращает список T. Мне больше интересно, есть ли лучший/более чистый способ управления моим объектом SQLConnection и каждый раз открывать/закрывать данное соединение. - person aherrick; 19.04.2011
comment
@aherrick, просто сделайте это в базовом контроллере или внешнем помощнике ... вы не хотите открывать и закрывать соединения 50 раз на одной странице ... даже с объединением в пул это может дорого обойтись - person Sam Saffron; 24.04.2011
comment
@SamSaffron это нормально, если я открою соединение в своем контроллере и уничтожу его в методе Dispose? - person NoobDeveloper; 31.07.2013
comment
@SamSaffron Я немного смущен. Джон Скит сказал, что «лучший подход почти всегда состоит в том, чтобы создавать новый SqlConnection каждый раз, когда он вам нужен, и утилизировать его, как только вы закончите с ним» в этом сообщении: stackoverflow.com/questions/26925209 / - person Xavier Egea; 14.11.2014