提问人:MiniW 提问时间:7/14/2016 最后编辑:MiniW 更新时间:1/2/2017 访问量:1976
排序,存储库模式中的分页和松散耦合
Sorting, Paging in the Repository pattern & loosely coupled
问:
我有一个简单地列出我数据库中所有销售人员的。
我想在网格中显示结果(想象一个 Web 界面),以便用户可以显示或隐藏任何字段、对列进行排序以及使用分页。SalesmanRepository
假设我有一个非常大的集合,因此排序和分页必须是服务器端的。
我的问题是,我怎样才能在我的架构中保持松散耦合?
- 我不希望我的数据库列的名称绑定到 UI 的列。我希望以后能够灵活地更改新类型的数据库。
- 我应该如何处理分页?例如,通过直接向存储库的方法添加参数(例如 and)?
page
numberOfItemsPerPage
- 我应该如何进行排序?我不想将数据库列的名称绑定到排序参数,因为我可以拥有一种新型数据库,并且会破坏我所有的软件。
基本上,我怎样才能接近这些概念并保持松散耦合?理想情况下,我想要一种与语言无关的方法,但如果有更好的特定于语言的答案,我会使用。C#
编辑:我的问题可以更精确:我怎样才能告诉我的存储库按字段排序,而不直接提及字段的名称?
编辑 2:我想告诉我的存储库按字段排序,但我不想绑定到实现,因为我的存储库的接口在我的业务逻辑层(或域层)中。
假设我有一个MySQL数据库(因此是一个),其中有一个名为包含列的表。SalesmanMySQLRepository
Salesman
Name
现在假设我还有一个 SQL Server 数据库(带有 ),其中包含一个名为包含相同列的表,但在这里我会命名它,因为我的团队出于某种原因决定在列中使用某种前缀。它是特定于细节的,与业务逻辑无关。SalesmanSQLRepository
Salesman
Name
BobbyName
我应该是什么样子的?我不想直接发送字符串,因为每个实现都是完全不同的。我想会有这样的方法,但是我应该如何处理这个参数?SalesmanRepository
PagedResult<Salesman> List(SortingParameter field)
答:
我做过一次。我通过创建一个对象解决了这个问题,如下所示:
public class ClientPage
{
private int PageIndex;
private int PageLengh;
private List<Client> Clients;
private int ClientsCount;
}
因此,我可以管理页面而不是客户列表。
希望这能以某种方式帮助你。
评论
PagedResult<E>
似乎您不希望在客户端和数据库上进行分页和排序,因此,我认为您唯一可以进行分页和排序的地方是在内存中,因此您可以编写一个共享方法,例如
public static IEnumerable<T> SortingAndPaging<T>(IEnumerable<T> entities, int pageSize, int pageNum, string sortField, string order)
{
//your sorting and paging logic goes here, maybe Linq is helpful here
}
通过这种方式,我们可以实现与数据库无关
我会通过将列标题中的文本作为我想要排序的文本发送到后端来解决,然后使用反射在对象中查找该属性名称。您需要确保列中的显示名称可通过算法或查找转换为字段名称。下面的代码是伪的,但方法是可靠的。
前端:
<th class="sortable">Last Name</th> ...
$('.sortable').onClick(function(event){
//send request to backend with text of header as sortBy
...
});
后端:
List<Person> GetPeople ( string sortBy )
{
//Person has property lastName
var propery = Person.GetField(SortByStringToPropertyName(sortBy));
List<Person> people = db.Persons.OrderBy(property).ToList();
return people;
}
评论