[英]Sorting, Paging in the Repository pattern & loosely coupled
我有一个SalesmanRepository
,它只列出数据库中的所有推销员。 我想在网格中显示结果(想象一个Web界面),以便用户可以显示或隐藏任何字段,对列进行排序并使用分页。
假设我有一个很大的集合,那么排序和分页必须在服务器端。
我的问题是,如何在架构中保持松散耦合?
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;
}
因此,我可以管理页面而不是客户列表。
希望这对您有所帮助。
似乎您不希望在客户端和数据库上都进行分页和排序,因此,我认为您唯一可以进行分页和排序的地方是在内存中,因此您可以编写共享方法,例如
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
}
这样,我们就可以实现数据库不可知论
我可以通过将列标题中的文本作为我想要的排序依据发送到后端,然后使用反射在对象中找到该属性名称来解决。 您需要确保该列中的显示名称可以通过算法或查询转换为字段名称。 下面的代码是伪ish,但方法是可靠的。
前端:
<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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.