在 CQRS 和 DDD 的上下文中,您将如何处理略有不同的用例?
In context of CQRS and DDD how would you handle slightly varying use cases?
我可以为每个变体设置一个命令,或者我可以有一个命令并处理其中的变体。
为了说明,我有三个用例(或更多),"CommentOnPhoto"、"CommentOnWall"、"CommentOnArticle"。他们都在内部使用相同的评论系统。三者的区别是:
- 需要检查不同的政策(
CommentOnPhotoPolicy
、CommentOnWallPolicy
、CommentOnArticlePolicy
)
- 必须从存储库中提取不同的聚合,以便我们可以调用
photo.attachComment(comment)
、article.attachComment(comment)
等
如果为每个变体走一个命令的路线那么每个命令都应该继承一些基础 CommentOnSomething
命令因为它们都非常相似吗?
如果对所有用例采用一个母命令的路径,那么我们将不得不使用服务定位器按需提取所需的策略和存储库(我们不想为每个用例注入 10 多个依赖项只能使用一个)。如果我们使用抽象工厂等来隐藏服务定位器的使用,这是可以接受的吗?这意味着我们有 CommentPolicyFactory
和 CommentableFactory
,它们在内部使用服务定位器来提供正确的策略和正确的聚合。
每个变体一个命令。
我会首先专注于创建一个非常通用的 "commenting" 组件(作为它自己的项目,与您的核心域分离)。一旦你有了它,那么你的命令CommentOnPhoto
、CommentsOnWall
和其他命令将变得非常简单,只需几行代码。
我可以为每个变体设置一个命令,或者我可以有一个命令并处理其中的变体。
为了说明,我有三个用例(或更多),"CommentOnPhoto"、"CommentOnWall"、"CommentOnArticle"。他们都在内部使用相同的评论系统。三者的区别是:
- 需要检查不同的政策(
CommentOnPhotoPolicy
、CommentOnWallPolicy
、CommentOnArticlePolicy
) - 必须从存储库中提取不同的聚合,以便我们可以调用
photo.attachComment(comment)
、article.attachComment(comment)
等
如果为每个变体走一个命令的路线那么每个命令都应该继承一些基础 CommentOnSomething
命令因为它们都非常相似吗?
如果对所有用例采用一个母命令的路径,那么我们将不得不使用服务定位器按需提取所需的策略和存储库(我们不想为每个用例注入 10 多个依赖项只能使用一个)。如果我们使用抽象工厂等来隐藏服务定位器的使用,这是可以接受的吗?这意味着我们有 CommentPolicyFactory
和 CommentableFactory
,它们在内部使用服务定位器来提供正确的策略和正确的聚合。
每个变体一个命令。
我会首先专注于创建一个非常通用的 "commenting" 组件(作为它自己的项目,与您的核心域分离)。一旦你有了它,那么你的命令CommentOnPhoto
、CommentsOnWall
和其他命令将变得非常简单,只需几行代码。