在MVC和存储库模式结构中排序

时间:2013-12-17 13:12:06

标签: asp.net-mvc repository-pattern roles

我正在使用ASP.NET MVC和带有service layer的存储库模式开发一个应用程序,该应用程序公开了另一个应用程序使用的Web服务中的某些功能。有时候我对每一层中的角色感到困惑。我怀疑的一个问题是如何排序要在视图上显示的对象列表。

我应该在视图,控制器,服务或存储库中订购列表吗?

由于这是“显示项目”的方式,我想这是一个视图责任,但我通过Web服务在另一个应用程序中使用相同排序的相同列表。那么,这个排序应该在服务层?或者我应该通过查询在存储库中订购,以优化排序?

1 个答案:

答案 0 :(得分:3)

如果您真正关注存储库模式,那么您的存储库应该包含以下方法:GetUpdateDelete等.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))