2011-04-19 16 views
7

Le estoy dando al nuevo Dapper Micro ORM lanzado por Stack Overflow/Sam Saffron una rápida utilización de MVC. Me pregunto ¿cuál es la forma más sencilla de administrar un objeto SQLConnection dentro de mi controlador? Estoy haciendo algo simple como esto solo para repasar algunos datos y probar Dapper, pero ¿es una idea abrir/cerrar la conexión de esa manera?ASP.NET MVC Administre SQLConnection con 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); 
    } 
} 

Respuesta

9

Simplemente crear, abrir y cerrar la conexión lo más localmente posible:

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

pesar de que es la mejor práctica para evitar los datos de acceso directo en tus controladores. Entierra tus métodos de acceso a datos dentro de una clase CommentsService o similar y llámalo desde tu controlador.

+0

Luke gracias por la respuesta. Solo estoy pensando en una aplicación CRUD extremadamente pequeña, mantenla lo más simple posible. – aherrick

+2

@aherrick: De acuerdo, probablemente haga lo mismo. Si el código realmente es así de simple, agregar capas y abstracciones adicionales a menudo empeora las cosas, ¡no mejor! – LukeH

0

nunca he usado, pero de var comments se difiere en su ejecución, entonces usted tiene un problema y tendrá que usar algo como .ToList enumerar plenamente los resultados antes de cerrar la conexión. De lo contrario, si .ExecuteMapperQuery enumera plenamente los resultados antes de devolverlas se le multa

+0

Gracias por la respuesta. Sí, enumera por completo y devuelve una Lista de T. Me pregunto más, ¿existe una forma mejor/más limpia para administrar mi objeto SQLConnection y tener que Abrir/Cerrar la conexión dada todo el tiempo? – aherrick

+1

@aherrick, solo hazlo en un controlador base, o ayuda externa ... no quieres abrir y cerrar conexiones 50 veces en una sola página ... incluso con la puesta en común esto puede ser costoso –

+0

@SamSaffron está bien si abro una conexión en mi controlador y la elimino en el método Dispose? – NoobDeveloper