【发布时间】:2019-10-21 16:47:29
【问题描述】:
可以返回域存储库中的页面对象,例如 UserRepository 中的页面 findUsers(int page, int limit) 方法。
【问题讨论】:
标签: java domain-driven-design ddd-repositories
可以返回域存储库中的页面对象,例如 UserRepository 中的页面 findUsers(int page, int limit) 方法。
【问题讨论】:
标签: java domain-driven-design ddd-repositories
一般来说,您应该避免查询您的域模型。聚合通常不适合查询,因为它们通常代表某种形式的图。您的相当一部分数据也可能被封装,并且为了查询而公开这些数据可能并不理想。
我建议移动查询,并通过扩展将分页转移到显式查询层,该层以有意义的形式返回数据。我倾向于使用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; }
}
}
【讨论】:
你搜索类似的东西吗?
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);
}
【讨论】:
DDD 是关于处理业务领域建模/实施中的复杂性。在 DDD 中,存储库是一种抽象,它提供了与技术无关的机制来存储/检索/删除域实体(聚合根)在其生命周期内(从创建到删除)。
可能以各种表示形式(分页、排序等)返回数据的复杂查询是完全不同的要求,最好通过不同的流程和数据模型来解决。例如,我们可以定义通过不同服务处理的单独 DTO(查询/查询响应),并从 lex 复杂的持久化数据(物化视图)中获取数据
【讨论】: