我正在使用ASP.NET MVC和带有service layer的存储库模式开发一个应用程序,该应用程序公开了另一个应用程序使用的Web服务中的某些功能。有时候我对每一层中的角色感到困惑。我怀疑的一个问题是如何排序要在视图上显示的对象列表。
我应该在视图,控制器,服务或存储库中订购列表吗?
由于这是“显示项目”的方式,我想这是一个视图责任,但我通过Web服务在另一个应用程序中使用相同排序的相同列表。那么,这个排序应该在服务层?或者我应该通过查询在存储库中订购,以优化排序?
答案 0 :(得分:3)
如果您真正关注存储库模式,那么您的存储库应该包含以下方法:Get
,Update
,Delete
等.FWIW,这就是为什么我有一个个人厌恶将存储库模式与Entity Framework一起使用:您所做的只是从存储库代理到EF并添加不必要的复杂层。
但是,您的服务 应该具有返回特定数据集的显式方法,而无需进一步评估。但是,排序有点异常。您可以直接从数据库中获取有序数据集,也可以订购内存中的结构,并且排序是非常特定于视图的事物之一。此外,您甚至可能希望以两种不同的方式订购相同的数据集,如果您单独依赖DAL层,则需要额外的不必要的查询。
我个人会说,在大多数情况下,订单应该在您的控制器操作中发生,但是如果某些东西应该始终按特定顺序返回,那么只需让您的服务层返回它已经订购。您也可以随时向服务方法添加一个参数,以允许传递订购方案,这样您就可以在操作中自定义此方案,但仍然可以由服务处理:
public IEnumerable<Something> GetSomething(Func<IQueryable<Something>, IOrderedQueryable<Something>> orderBy = null)
{
...
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
然后:
service.GetSomething(m => m.OrderBy(o => o.Field1).ThenBy(o => o.Field2))