Architecture 在CQRS和DDD的上下文中,您将如何处理略有不同的用例?

Architecture 在CQRS和DDD的上下文中,您将如何处理略有不同的用例?,architecture,domain-driven-design,cqrs,Architecture,Domain Driven Design,Cqrs,我可以为每个变体使用一个命令,也可以使用一个命令来处理其中的变体 为了举例说明,我有三个(或更多)用例,“CommentOnPhoto”、“CommentOnWall”、“CommentOnArticle”。他们都在内部使用相同的评论系统。三者之间的区别是: 需要检查不同的策略(CommentOnPhotoPolicy,CommentOnWallPolicy,CommentOnArticlePolicy) 必须从存储库中提取不同的聚合,以便我们可以调用,photo.attachComment(

我可以为每个变体使用一个命令,也可以使用一个命令来处理其中的变体

为了举例说明,我有三个(或更多)用例,“CommentOnPhoto”、“CommentOnWall”、“CommentOnArticle”。他们都在内部使用相同的评论系统。三者之间的区别是:

  • 需要检查不同的策略(
    CommentOnPhotoPolicy
    CommentOnWallPolicy
    CommentOnArticlePolicy
  • 必须从存储库中提取不同的聚合,以便我们可以调用,
    photo.attachComment(comment)
    article.attachComment(comment)
    ,等等
如果对每个变体使用一个命令,那么每个命令是否应该继承一些基本的
注释something
命令,因为它们都非常相似


如果对所有用例使用一个母命令,那么我们将不得不使用服务定位器按需拉取所需的策略和存储库(我们不希望为每个用例注入10+个依赖项,只使用一个)。如果我们使用抽象工厂等来隐藏服务定位器的使用,这是可以接受的吗?这意味着我们有
CommentPolicyFactory
CommentableFactory
,它们在内部使用服务定位器来提供正确的策略和正确的聚合。

每个变体一个命令


我首先将重点放在创建一个非常通用的“注释”组件上(作为它自己的项目,与您的核心域分离)。一旦你有了它,你的命令
CommentOnPhoto
CommentsOnWall
和其他命令将变得非常简单,只需要几行代码。

这就是我选择的方式。我唯一的问题是,现在有很多命令处理程序、命令定义以及控制器方法来为所有用例提供服务。@Denisphenov对您很好。你已经接近于物体健美操了。您的系统可以很容易地转变为微服务和/或事件驱动,并且通常会在可扩展性方面有很大帮助。如果我有不同的策略和攻击,我不会称之为“轻微”。这取决于您的域,但您的示例甚至可以有3个不同的有界上下文。