Domain driven design 可用数据和选定数据的readmodel

Domain driven design 可用数据和选定数据的readmodel,domain-driven-design,cqrs,Domain Driven Design,Cqrs,我正在努力遵循DDD和CQRS的原则,在我目前正在进行的项目中。 我现在正在为一个设计决策而挣扎。 假设我有一个页面,其中包含用户可以订阅的主题列表。用户还可以看到他订阅了哪些主题。 如何检索数据?我是否分别查询主题和标记的主题 e、 g GetTopics GetMarkedTopicsForUser 然后在视图中,我神奇地组合了2,这样用户就可以看到他的订阅。 还是制作一个包含所有主题并已标记用户订阅的主题的模型 e、 g GetTopicOverviewForUser 假设我有一个

我正在努力遵循DDD和CQRS的原则,在我目前正在进行的项目中。 我现在正在为一个设计决策而挣扎。 假设我有一个页面,其中包含用户可以订阅的主题列表。用户还可以看到他订阅了哪些主题。 如何检索数据?我是否分别查询主题和标记的主题

e、 g

  • GetTopics
  • GetMarkedTopicsForUser
然后在视图中,我神奇地组合了2,这样用户就可以看到他的订阅。 还是制作一个包含所有主题并已标记用户订阅的主题的模型

e、 g

  • GetTopicOverviewForUser
假设我有一个页面,其中包含用户可以订阅的主题列表。用户还可以看到他订阅了哪些主题。如何检索数据

有多种方法可以做到这一点,但我将创建两种:

  • AllTopics:所有主题的列表
  • UserWithTopics:查看用户已订阅的主题

构建页面时,您可以使用这两个数据查看用户可以在该页面中订阅哪些主题,也可以取消订阅。由于两端最多有50个主题,因此页面构造的性能不应该是一个问题。

这实际上取决于设计决策-您将向用户展示什么

  • 所有主题的列表和当前订阅的列表
  • 所有主题以及用户是否有订阅
  • 如果为1,则需要结果视图

    var resultView=新的两个resultView(可用主题、订阅主题);
    
    返回

    "res": {
      "availableTopics": 
      [
        {
           "topic": "topic1",
        }
      ],
      "subscribedTopics": 
      [
        {
           "topic": "anotherTopic"
        }
      ]
    }
    
      [
        {
           "topic": "topic1",
           "subscribed": true
        }
      ],
    
    或者如果2

    var resultView=new SingleResultView(可用主题、SUSBCRTIPTIONTOPS);
    
    返回

    "res": {
      "availableTopics": 
      [
        {
           "topic": "topic1",
        }
      ],
      "subscribedTopics": 
      [
        {
           "topic": "anotherTopic"
        }
      ]
    }
    
      [
        {
           "topic": "topic1",
           "subscribed": true
        }
      ],
    

    无论哪种方式,您只需要调用一次API,除非有明显的(和可问责的-也称为性能)理由对其进行优化。

    几个问题:您的系统最多可以有多少主题?用户最多可以订阅多少个主题?对此的回答将影响您在建模方面的决策。主题的最大数量为50个。如果用户愿意,他可以选择50个主题中的所有主题。。。主要是关于它们是一起使用还是可以单独使用以及它们调用的频率?我还要注意,CQR是关于两个主要活动的分离(命令-更改状态&查询-检索状态)-这些是不同的模型,而不是实现细节。如果你正在谈论EventSourcing,那将是一个不同的话题。您可以优化选项2,以存储主题和订阅状态,但这需要进行其他权衡。我同意,否则,每个用户都将获得一个包含所有未订阅主题的大型阅读模型,在出现新主题时,总是需要更新,无需特殊原因。