在存储库模式中进行排序,分页&松散耦合

时间:2016-07-13 21:54:35

标签: c# design-patterns architecture language-agnostic repository

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

假设我有一个非常大的集合,因此排序和分页必须是服务器端。

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

  1. 我不希望我的数据库列的名称绑定到用户界面的列。我希望以后可以灵活地更改新类型的数据库。
  2. 我该如何处理分页?例如,将pagenumberOfItemsPerPage等参数直接添加到存储库的方法中?
  3. 我该如何处理排序?我不想将数据库列的名称绑定到排序参数,因为我可能有一个新类型的数据库,我会破坏我的所有软件。
  4. 基本上,我如何处理这些概念并保持松散耦合?理想情况下,我想要一种与语言无关的方法,但如果有更好的语言特定答案,我会使用C#

    编辑:我的问题可以更精确:如何告诉我的存储库按字段排序,而不直接提及字段的名称?

    编辑2 :我想告诉我的存储库按字段排序,但我不希望被绑定到实现,因为我的存储库的界面在我的业务逻辑中图层(或域图层)。

    假设我有一个MySQL数据库(因此为SalesmanMySQLRepository),其中包含一个名为Salesman的表,其中包含一列Name

    现在我们说我还有一个SQL Server数据库(带有SalesmanSQLRepository),其中一个名为Salesman的表包含相同的列Name,但在这里我会将其命名为BobbyName,因为我的团队决定在列上有某种前缀,无论出于何种原因。它是特定于细节的,与业务逻辑无关。

    我的SalesmanRepository应如何?我不想直接发送字符串,因为在每个实现中完全不同。我想会有一个类似PagedResult<Salesman> List(SortingParameter field)的方法,但我应该如何处理这个参数呢?

3 个答案:

答案 0 :(得分:0)

我曾经做过一次。我通过创建一个像这样的对象解决了这个问题:

public class ClientPage
{
    private int PageIndex;
    private int PageLengh;
    private List<Client> Clients;
    private int ClientsCount;
}

所以我可以管理页面而不是客户列表。

希望这能以某种方式帮助你。

答案 1 :(得分:0)

您似乎不希望在客户端和数据库上进行分页和排序,因此,我认为您可以在内存中进行分页和排序的唯一位置,因此您可以编写像

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
}

由此,我们可以实现数据库不可知

答案 2 :(得分:0)

我会通过将列标题中的文本发送到后端作为我想要排序的内容然后使用反射来查找对象中的属性名称来解决。您需要确保列中的显示名称可通过算法或查找转换为字段名称。下面的代码是伪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;
}