[ASP.NET MVC] Repositorios automáticos con MvcScaffolding

Posted on Actualizado enn


Hola, cuando estamos trabajando con ASP.NET MVC, y vamos a crear un nuevo controlador, tenemos la opción de crearlo utilizando diferentes templates, entre ellas encontramos un controlador vacío, y otros con operaciones CRUD con y sin el uso de Entity Framework, sin embargo el problema de utilizar el controlador de operaciones CRUD con Entity Framework, es que dicho controlador va a conocer directamente el contexto con el cual vamos a trabajar, lo cual en términos de arquitectura y diseño de aplicación no es la mejor opción.

Para solucionar (en parte) el problema anterior, una primera aproximación y que voy a mostrar en este post es usar repositorios, los cuales van a encapsular las operaciones CRUD y algunas otras operaciones que necesitemos sobre cada una de nuestras entidades de negocio, así luego nuestro controlador va a conocer el repositorio y no el contexto.

Entonces, lo primero que debemos hacer es agregar el paquete MvcScaffolding utilizando NuGet:

image

El siguiente paso es crear una o varias clases en la carpeta Models:

public class Person
{
	public int Id { get; set; }
	public string Name { get; set; }
	public string Twitter { get; set; }
}

Una vez con nuestro modelo listo (no olviden hacer build al proyecto antes de seguir), vamos a crear el controlador, en este caso en el template ya tenemos dos nuevas opciones, peor vamos a usar la que dice: “MvcSccaffolding: Controller with read/write action and view, using repositories”, como modelo escogemos la clase person y en contexto seleccionamos New data context y asignamos un nombre:

image

Una vez el asistente termina la creación de los objetos, lo que tenemos es:

1. Controlador PersonController

Tiene una referencia a la interfaz IPersonRepository:

private readonly IPersonRepository personRepository;

Y si nos fijamos en cada acción siempre utiliza el repositorio en lugar de el contexto.

2. Clase PersonRepository e interfaz IPersonRepository

En la carpeta Models se crea la clase PersonRepository que implementa la interfaz IPersonRepository:

public interface IPersonRepository : IDisposable
{
	IQueryable<Person> All { get; }
	IQueryable<Person> AllIncluding(params Expression<Func<Person, object>>[] includeProperties);
	Person Find(int id);
	void InsertOrUpdate(Person person);
	void Delete(int id);
	void Save();
}

public class PersonRepository : IPersonRepository
{
	...
}

En el ejemplo pueden ver todo el código de la clase PersonRepository.

3. Contexto

Finalmente se genera otra clase, para este ejemplo TestContext, que hereda de DBContext y tiene una propiedad del tipo Person, que en este caso es nuestro modelo:

public class TestContext : DbContext
{
	public DbSet<MvcS_Scaffolding.Models.Person> People { get; set; }
}

En resumen, con este template tenemos una mejora en la arquitectura de nuestra aplicación, y puede ser un buen inicio para involucrarse en el tema de patrones de diseño y de arquitectura, sin embargo es bueno tener presente que para crear una aplicación robusta es necesario utilizar mucho más elementos.

Espero les haya gustado el post, les dejo el código del ejemplo:

Descarga el ejemplo!

Saludos!

7 comentarios sobre “[ASP.NET MVC] Repositorios automáticos con MvcScaffolding

    jhonnys.lopez escribió:
    01/03/2013 en 08:14

    Una excelente forma de empezar con el uso de los Repositorios y con las plantillas T4, aunque yo editaria la plantilla para cambiar algunas cosillas como por ejemplo no retornar IQuerable(Of T) sino un IEnumerable(Of T) o un List(Of T) forzando el llamado a .ToList() y que de esa manera se ejecuten las consultas en el repositorio que es donde debe ser. Saludos.

      Julio Avellaneda respondido:
      01/03/2013 en 09:45

      Gracias por el comentario amigo Jhonnys, si bn es cierto q no es la mejor implementación de repositorios, es un buen inicio, y pues es mucho mejor que el scaffolding que por defecto viene con MVC, como comente también que solo es un buen inicio, no edite la template para no complicar más el post😀

      Saludos

    […] [ASP.NET MVC] Repositorios automáticos con MvcScaffolding […]

    […] las responsabilidades, por lo general aplicando el patrón Repositorio (más al respecto en esta liga). De esa manera, el código sería aprox. así (con un ejemplo bastante […]

    agustin107 escribió:
    08/02/2013 en 14:50

    Que tal, muchas gracias por compartir conocimientos y herramientas.
    Ahora quisiera saber en el caso de queramos usar el Template de Entity Framework para realizar inserción, edición y eliminación.
    No podremos utilizar en Scaffolding no?
    Una vez más gracias por compartir. Saludos!

    Julio Avellaneda respondido:
    08/10/2013 en 11:54

    Hola Agustin, claro que si puedes hacerlo, fijate en las opciones y verás que tienes una opción que te permite usar entity framework, además fijate que la clase TextContext hereda de DbContext, con lo que ya estás trabajando con Entity Framework.

    Saludos y gracias por tu comentario!

    JuanFN escribió:
    04/07/2014 en 15:04

    Hola, buenas, estoy empezando con esto de MVC 4 y EF 6. Intenté seguir el post respecto del tema del repositorio, pero al posicionarme sobre la carpeta controller e intentar agregar un nuevo controlador, sale referencia a objeto no establecida como instancia de objeto. De todas maneras gracias por el post.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s