【问题标题】:Can repository return paging collections in DDD?存储库可以返回 DDD 中的分页集合吗?
【发布时间】:2019-10-21 16:47:29
【问题描述】:

可以返回域存储库中的页面对象,例如 UserRepository 中的页面 findUsers(int page, int limit) 方法。

【问题讨论】:

    标签: java domain-driven-design ddd-repositories


    【解决方案1】:

    一般来说,您应该避免查询您的域模型。聚合通常不适合查询,因为它们通常代表某种形式的图。您的相当一部分数据也可能被封装,并且为了查询而公开这些数据可能并不理想。

    我建议移动查询,并通过扩展将分页转移到显式查询层,该层以有意义的形式返回数据。我倾向于使用I{AggregateName}Query,但你可以随意命名它。我可以有以下方法:

    public interface ICustomerQuery
    {
        IEnumerable<Query.Customer> Search(Query.Customer.Specification specification);
        int Count(Query.Customer.Specification specification);
        Page<Query.Customer> Search(Query.Customer.Specification specification, int page);
    }
    

    在这里,我的主命名空间中有一个命名空间Query,其中可能包含读取模型,它们是纯数据传输对象(数据容器),仅包含形状而没有行为。 Customer 域聚合很可能包含联系人和地址列表,我不想仅仅为了在列表中显示它们而进行水合。另一方面,Query.Customer 读取模型是一个相当平坦的事情,尽管您可能选择为某些获取策略包含更复杂的东西。例如:

    namespace SomeProduct.Query
    {
        public class Customer
        {
            Guid Id { get; set; }
            string Name { get; set; }
            string PrimaryAddress { get; set; }
        }
    }
    

    【讨论】:

    • 谢谢。实现起来太复杂了。
    【解决方案2】:

    你搜索类似的东西吗?

    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.repository.PagingAndSortingRepository;
    
    public interface UserRepository<User> extends PagingAndSortingRepository<User, Long> {
    
        Page<User> findUsers(Pageable pageable);
    }
    

    【讨论】:

    • 请问,在领域驱动设计中,存储库中的分页查询可以返回聚合还是实体?
    【解决方案3】:

    DDD 是关于处理业务领域建模/实施中的复杂性。在 DDD 中,存储库是一种抽象,它提供了与技术无关的机制来存储/检索/删除域实体(聚合根)在其生命周期内(从创建到删除)。

    可能以各种表示形式(分页、排序等)返回数据的复杂查询是完全不同的要求,最好通过不同的流程和数据模型来解决。例如,我们可以定义通过不同服务处理的单独 DTO(查询/查询响应),并从 lex 复杂的持久化数据(物化视图)中获取数据

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多