Estoy estudiando MVC y EF por el momento y veo con bastante frecuencia en los artículos sobre esos temas que el controlador manipula los datos a través de un objeto Repositorio en lugar de usar directamente LINQ para Entidades.¿Es realmente necesario implementar un Repositorio cuando se usa Entity Framework?
Creé una pequeña aplicación web para probar algunas ideas. Se declara la siguiente interfaz como una abstracción del almacenamiento de datos
public interface ITinyShopDataService
{
IQueryable<Category> Categories { get; }
IQueryable<Product> Products { get; }
}
Entonces tengo una clase que hereda de la clase generada TinyShopDataContext (heredado de ObjectContext) e implementa ITinyShopDataService.
public class TinyShopDataService : TinyShopDataContext, ITinyShopDataService
{
public new IQueryable<Product> Products
{
get { return base.Products; }
}
public new IQueryable<Category> Categories
{
get { return base.Categories; }
}
}
Finalmente, un controlador utiliza una implementación de ITinyShopDataService para obtener los datos, p. para mostrar productos de una categoría específica.
public class HomeController : Controller
{
private ITinyShopDataService _dataService;
public HomeController(ITinyShopDataService dataService)
{
_dataService = dataService;
}
public ViewResult ProductList(int categoryId)
{
var category = _dataService.Categories.First(c => c.Id == categoryId);
var products = category.Products.ToList();
return View(products);
}
}
Creo que el controlador anterior posee algunas propiedades positivas.
- Es fácilmente comprobable debido a que se está inyectando el servicio de datos.
- Utiliza sentencias LINQ que consultan un almacenamiento de datos abstracto de forma neutral para la implementación.
Por lo tanto, no veo ningún beneficio de agregar un repositorio entre el controlador y la clase ObjectContext-derived. ¿Qué extraño? (Lo siento, fue un poco demasiado largo para la primera publicación)
Ok, lo despojó de todo lo que no sea esencial y sólo la dejó líneas que ilustran la idea de que, si hubiera creado un Repositorio, habría consistido únicamente en métodos de una o dos líneas que casi no hubieran agregado ningún valor apreciable. –
Ah, ahora veo lo que dices ... Estás extrayendo una interfaz de DBContext, en lugar de usar un repositorio para envolverlo. –