关于DDD,5层模型和业务逻辑的问题

时间:2011-04-01 09:42:06

标签: model domain-driven-design business-logic

当我得到它时,模型是DDD分为这些层:

  • 存储(数据库,文件,缓存......)
  • Mapper(从存储中获取数据)
  • 存储库(管理单个实体类型的数据,可以使用不同的映射器)
  • 实体(一个简单的数据容器,独立于其他层)
  • 服务(处理业务逻辑,如获取按标题按字母顺序排列的5个最新帖子,使用存储库)

所以,这是5级(如果我误解了某些内容,请纠正我)。问题是:

如果我有与单个实体相关的业务逻辑,我应该在实体中还是在服务中实现它?

例如,如果我有一个帖子并希望检索所有已批准的评论,那么它应该是Post.getApprovedComments(实体)还是CommentsService.getApprovedCommentsForPost(Post post)

(不,使用post.getComments().filter(comment -> comment.approved)是不对的,因为这会将业务逻辑移出模型。以防万一有人问。)

1 个答案:

答案 0 :(得分:4)

  

所以,这是5级(如果我误解了某些内容,请纠正我。)

我认为,就代码而言,人们通常会将数据存储,ORM和存储库分组到一个“层”中。另外,不要忘记演示。

  

如果我有业务逻辑   我应该与单个实体相关   在实体中或在实体中实现它   服务?

是的,如果它是与实体相关的行为,那么它应该驻留在实体内。实体不应该只是简单的数据容器,而是实体/模型层应该封装与业务模型相关的数据结构和行为。这样,如果您需要在另一个应用程序中重用Model层,您就不必四处寻找您在其他层中停留的相关行为。

  

例如,如果我有一个帖子并且想要检索所有已批准的评论,那么>应该是Post.getApprovedComments(实体)还是> CommentsService.getApprovedCommentsForPost(帖子发布)?

如果不了解有关您的架构和ORM的更多信息,很难说。我可能会使用Post .. route(注释应该是Post实体的集合),然后getApprovedComments可能是一个简单的linq查询等。您建议的基于服务的方法对我来说并不是非常OOP。

  

(不,使用post.getComments()。过滤器(c - > comment.approved)是不对的,因为这会将业务逻辑移出模型。以防万一有人问。)

我不完全确定我在这里同意你的观点。对于这么简单的事情,有些人可能认为这是可以接受的。

我补充说:

  

服务(处理业务逻辑,如获取按标题按字母顺序排列的5个最新帖子,使用存储库)

...在我看来不是一个服务的好例子。服务层在此示例中不执行任何操作 - 这应该只是PostRepository中定义的查询方法。

希望其中一些有点帮助...