当我得到它时,模型是DDD分为这些层:
所以,这是5级(如果我误解了某些内容,请纠正我)。问题是:
如果我有与单个实体相关的业务逻辑,我应该在实体中还是在服务中实现它?
例如,如果我有一个帖子并希望检索所有已批准的评论,那么它应该是Post.getApprovedComments
(实体)还是CommentsService.getApprovedCommentsForPost(Post post)
?
(不,使用post.getComments().filter(comment -> comment.approved)
是不对的,因为这会将业务逻辑移出模型。以防万一有人问。)
答案 0 :(得分:4)
所以,这是5级(如果我误解了某些内容,请纠正我。)
我认为,就代码而言,人们通常会将数据存储,ORM和存储库分组到一个“层”中。另外,不要忘记演示。
如果我有业务逻辑 我应该与单个实体相关 在实体中或在实体中实现它 服务?
是的,如果它是与实体相关的行为,那么它应该驻留在实体内。实体不应该只是简单的数据容器,而是实体/模型层应该封装与业务模型相关的数据结构和行为。这样,如果您需要在另一个应用程序中重用Model层,您就不必四处寻找您在其他层中停留的相关行为。
例如,如果我有一个帖子并且想要检索所有已批准的评论,那么>应该是Post.getApprovedComments(实体)还是> CommentsService.getApprovedCommentsForPost(帖子发布)?
如果不了解有关您的架构和ORM的更多信息,很难说。我可能会使用Post .. route(注释应该是Post实体的集合),然后getApprovedComments可能是一个简单的linq查询等。您建议的基于服务的方法对我来说并不是非常OOP。
(不,使用post.getComments()。过滤器(c - > comment.approved)是不对的,因为这会将业务逻辑移出模型。以防万一有人问。)
我不完全确定我在这里同意你的观点。对于这么简单的事情,有些人可能认为这是可以接受的。
我补充说:
服务(处理业务逻辑,如获取按标题按字母顺序排列的5个最新帖子,使用存储库)
...在我看来不是一个服务的好例子。服务层在此示例中不执行任何操作 - 这应该只是PostRepository中定义的查询方法。
希望其中一些有点帮助...