Domain driven design DDD是否允许列表作为聚合根?

Domain driven design DDD是否允许列表作为聚合根?,domain-driven-design,repository,aggregate,aggregateroot,Domain Driven Design,Repository,Aggregate,Aggregateroot,我试图理解领域驱动设计的基本原理。昨天,我在正在处理的一个项目中发现了一些代码,其中存储库返回了一个实体列表,即list getMessages(),其中Message是一个实体(有自己的id,可以修改)。现在,当阅读DDD中的存储库时,它们非常明确,存储库应该返回聚合根,对聚合的任何操作都应该通过调用聚合根中的方法来完成 我想将列表放在它自己的类中,然后返回该类。但是,在我的项目中,除了遵守DDD之外,基本上不需要这样做,因为我们只显示消息、添加新消息或删除现有消息。我们永远不必删除所有消息,

我试图理解领域驱动设计的基本原理。昨天,我在正在处理的一个项目中发现了一些代码,其中存储库返回了一个实体列表,即list getMessages(),其中Message是一个实体(有自己的id,可以修改)。现在,当阅读DDD中的存储库时,它们非常明确,存储库应该返回聚合根,对聚合的任何操作都应该通过调用聚合根中的方法来完成

我想将列表放在它自己的类中,然后返回该类。但是,在我的项目中,除了遵守DDD之外,基本上不需要这样做,因为我们只显示消息、添加新消息或删除现有消息。我们永远不必删除所有消息,因此我们唯一的方法是,
addMessage(…)
getMessages()
updateMessage(…)
removeMessage(…)
,这基本上就是我们的域服务所做的


有什么想法吗?当涉及到描述聚合和存储库时,DDD中的最佳实践是什么?

DDD新概念中令人困惑的一个方面是存储库概念。 存储库: 使用用于访问域对象的类似集合的接口在域和数据映射层之间进行调解

存储库提供了获取对聚合根的引用的能力。不是实体、值对象,而是聚合根(我不同意“存储库应该返回聚合根”)

建议: -每个聚合根目录一个存储库

  • 存储库接口(如IMessageRepository)驻留在域模型中
公共接口IMessageRepository()
{
无效保存消息(消息消息消息);
无效删除消息(消息消息消息);
Ilist getMessages();
}
  • 存储库实现(例如,如果使用nhibernate,则为NHibernateMessageRepository)位于域之外

希望这有帮助

当然,存储库不应该返回聚合根,它应该始终只返回对聚合根的引用,这是隐含的。但是谢谢你的回复,它确实有帮助。现在我买了Eric Evans的书,所以我将做进一步的研究。@Andreaselenwall返回聚合根和返回聚合根引用之间的区别是什么?存储库用于返回聚合根实例。
public interface IMessageRepository()
{
     void saveMessage(Message msg);
     void removeMessage(Message msg);
     Ilist<Messages> getMessages();
}