Quiero asegurarme de que sigo los estándares y las mejores prácticas de la industria con mi primer crack real en MVC. En este caso, es ASP.NET MVC, que usa C #.
Usaré Entity Framework 4.1 para mi modelo, con objetos de código primero (la base de datos ya existe), por lo que habrá un objeto DBContext para recuperar datos de la base de datos.
En las demostraciones que revisé en el sitio web asp.net, los controladores tienen código de acceso a datos. Esto no me parece correcto, especialmente cuando sigo las prácticas DRY (no se repita).
Por ejemplo, supongamos que estoy escribiendo una aplicación web para usar en una biblioteca pública, y tengo un controlador para crear, actualizar y eliminar libros en un catálogo.
Varias de las acciones pueden tomar un ISBN y deben querer devolver un objeto "Libro" (tenga en cuenta que probablemente este no sea un código 100% válido):
public class BookController : Controller
{
LibraryDBContext _db = new LibraryDBContext();
public ActionResult Details(String ISBNtoGet)
{
Book currentBook = _db.Books.Single(b => b.ISBN == ISBNtoGet);
return View(currentBook);
}
public ActionResult Edit(String ISBNtoGet)
{
Book currentBook = _db.Books.Single(b => b.ISBN == ISBNtoGet);
return View(currentBook);
}
}
En cambio, ¿ debería tener un método en mi objeto de contexto db para devolver un Libro? Parece que es una mejor separación para mí y ayuda a promover DRY, porque podría necesitar obtener un objeto Book por ISBN en algún otro lugar de mi aplicación web.
public partial class LibraryDBContext: DBContext
{
public Book GetBookByISBN(String ISBNtoGet)
{
return Books.Single(b => b.ISBN == ISBNtoGet);
}
}
public class BookController : Controller
{
LibraryDBContext _db = new LibraryDBContext();
public ActionResult Details(String ISBNtoGet)
{
return View(_db.GetBookByISBN(ISBNtoGet));
}
public ActionResult Edit(ByVal ISBNtoGet as String)
{
return View(_db.GetBookByISBN(ISBNtoGet));
}
}
¿Es este un conjunto válido de reglas a seguir en la codificación de mi aplicación?
O supongo que una pregunta más subjetiva sería: "¿es esta la forma correcta de hacerlo?"
fuente
Esta es la forma en que lo he estado haciendo, aunque estoy inyectando el proveedor de datos como una interfaz de servicio de datos genérica para poder intercambiar implementaciones.
Hasta donde yo sé, el controlador está destinado a ser donde obtienes datos, realizas cualquier acción y pasas datos a la vista.
fuente