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 All { get; } IQueryable AllIncluding(params Expression>[] 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 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!