所以我已经使用存储过程在 DAL 中实现了 objectDataSource 自定义分页,就像所有指南和教程描述的那样,但我意识到通过将自定义分页逻辑放在数据访问层,你可以使用多少领域模型。
例如,我有一个带有网格视图的网络表单,我想显示属于特定办公室 (OfficeId) 的每个客户 (CustomerId) 以及他们的订单状态 (OrderId)(如果有的话)。
因此,在我的服务层中,我可以填写一个 DTO 列表,例如(我是 DDD 的新手,所以我确信这个设计不是很好,但请耐心等待):
ObjectDataSource SelectMethod 绑定到:
public List<CustomerAndOrderDTO> GetCustomersByOffice(int officeId, int startPageIndex, int maxiumRows)
{
List<CustomerAndOrderDTO> customerAndOrderDTO = null;
List<Customer> customers = Customer.GetCustomersByOffice(int officeId);
foreach (Customer customer in customers)
{
customerAndOrderDTO.Add(new CustomerAndOrderDTO(customer));
}
return customerAndOrderDTO;
}
这是 DTO 类:
public CustomerAndOrderDTO
{
public int OrderId {get; set;}
public int CustomerId {get; set;}
public CustomerAndOrderDTO(Customer customer)
{
CustomerId = customer.Id;
Order order = customer.GetOrder();
OrderId = order.Id;
}
}
非常简单的代码,您可以获得域模型的所有灵活性和强大功能以及验证和持久性检查,同时保留在 BLL 中。
即使您想忽略在域中聚合对象的好处,而只是在存储过程级别组合数据,例如 select * from Customers left join Orders on .... left join Office on ... where...。你最终会编写一百万个扩展方法来为每一种可能的组合实现分页,比如 CustomersOrdersByOfficePaged、CustomersOrdersByAccountDatePaged 等……
所以我一开始就做错了吗?或者服务层的分页有意义吗?如果是这样,如何实现它?