繁体   English   中英

排序,按存储库模式分页和松散耦合

[英]Sorting, Paging in the Repository pattern & loosely coupled

我有一个SalesmanRepository ,它只列出数据库中的所有推销员。 我想在网格中显示结果(想象一个Web界面),以便用户可以显示或隐藏任何字段,对列进行排序并使用分页。

假设我有一个很大的集合,那么排序和分页必须在服务器端。

我的问题是,如何在架构中保持松散耦合?

  1. 我不希望将数据库列的名称绑定到UI的列。 我希望以后可以灵活更改为新型数据库。
  2. 我应该如何处理分页? 通过将诸如pagenumberOfItemsPerPage参数直接添加到存储库的方法中,例如?
  3. 我还应该如何进行排序? 我也不想将数据库列的名称绑定到sorting参数,因为在这种情况下,我可能拥有一种新型的数据库,并且会破坏我的所有软件。

基本上,我该如何处理这些概念并保持松散耦合? 理想情况下,我希望使用一种与语言无关的方法,但是如果有更好的特定于语言的答案,我将使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM