我目前正在学习MVC和EF,我经常在这些主题的文章中看到控制器通过Repository对象操作数据,而不是直接使用LINQ to Entities。
我创建了一个小型Web应用程序来测试一些想法。它声明以下接口作为数据存储的抽象。
public interface ITinyShopDataService
{
IQueryable<Category> Categories { get; }
IQueryable<Product> Products { get; }
}
我有一个类,它继承自生成的类TinyShopDataContext(继承自ObjectContext),并实现了ITinyShopDataService。
public class TinyShopDataService : TinyShopDataContext, ITinyShopDataService
{
public new IQueryable<Product> Products
{
get { return base.Products; }
}
public new IQueryable<Category> Categories
{
get { return base.Categories; }
}
}
最后,控制器使用ITinyShopDataService的实现来获取数据,例如用于显示特定类别的产品。
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);
}
}
我认为上面的控制器具有一些积极的特性。
- 由于注入了数据服务,因此易于测试。
- 它使用LINQ语句以实现中立的方式查询抽象数据存储。
因此,我不认为在控制器和ObjectContext派生类之间添加仓库的任何好处。我错过了什么吗? (抱歉,第一篇文章有点长)