Oop CQRS-围绕“的选项”;获取或创建;

Oop CQRS-围绕“的选项”;获取或创建;,oop,architecture,cqrs,Oop,Architecture,Cqrs,我使用CQRS模式(没有事件源,也没有DDD,但是命令和查询之间有明显的区别)来组合一些东西 我试图建模的操作是“获取或创建”,给定一组参数。正在创建(或获取)的项目实际上是一个唯一的通信链路ID。双方中的任何一方都可以说“获取或创建我与另一方之间的通信链路”,并返回一个新的临时随机ID(这在双方之间都有效)。然后,他们可以使用该ID发送/接收消息(一个PostMessage命令或GetRecentMessages查询)。此临时ID可以传递,但也可以集中失效、控制等。双方之间的不同会话应单独记录

我使用CQRS模式(没有事件源,也没有DDD,但是命令和查询之间有明显的区别)来组合一些东西

我试图建模的操作是“获取或创建”,给定一组参数。正在创建(或获取)的项目实际上是一个唯一的通信链路ID。双方中的任何一方都可以说“获取或创建我与另一方之间的通信链路”,并返回一个新的临时随机ID(这在双方之间都有效)。然后,他们可以使用该ID发送/接收消息(一个
PostMessage
命令或
GetRecentMessages
查询)。此临时ID可以传递,但也可以集中失效、控制等。双方之间的不同会话应单独记录

我知道更典型的“insert-then-getme-the-ID-back”是由具有GUID参数的命令处理的。但这似乎不适用于这里,因为当然该项目可能已经存在

我的选择,我相信:

  • 执行
    GetOrCreateCommsLink
    命令,然后执行
    GetActiveCommsLinkId
    查询,即命令,然后执行查询。感觉是错误的,因为命令通常是异步的(虽然到目前为止还没有出现在我的简单原型中),等待命令然后在我的服务层中运行查询是否正确
  • 运行
    GetExistingorNewActiveCommLinkId
    查询,该查询将返回现有会话ID,或者创建并返回一个会话ID。感觉不对,因为这是一个肮脏的欺骗,在查询中读取和改变状态
  • 不要对应用程序的这一部分使用CQR
  • 让每个客户端为会话使用自己的ID-
    NotifyCommsLinkIdentifier
    命令从每端指定参数和自己的ID,该ID通过命令在内部链接到实际ID。然后根据前面指定的标识符运行
    getUnderlineingCommsLinkId
    查询,以在需要时发现该ID。感觉不对,因为发明这个额外的概念似乎只是因为CQRS模式,而不是任何实际的领域/业务需求
  • 我想我的问题通常是如何处理潜在的先做后做或者先做后做的场景。我是否应该按照选项1在我的服务层中将它们链接在一起


    有没有一种标准的方法,或者说是标准的方法呢?

    所以你说的是CQS,而不是CQR。基本上,您正试图找到解决方法,以便严格地实现CQS模式,以实现一些自然可能不是真正的异步命令的东西

    我的建议是:不要因为模式而尝试应用模式,而是因为它是有意义的。这对你来说有意义吗?有什么好处?记住,你不是亚马逊。你真的需要它吗


    也就是说,我通常不采用纯粹的方式,而是允许命令在需要时返回简单的ID。这将使您的体系结构更加简单;您仍然可以将命令与查询分开,这对我来说是最重要的优势。

    太好了,谢谢。到目前为止,在使用CQS/CQR的过程中,我从大型单片服务中获得了巨大的感受,而不是使用单独的命令和查询,每种类型都受益于我构建的特定附加框架功能。DDD也可以做类似的事情,但我觉得整个团队都需要更多的OOP专业知识。所以我很喜欢它,但我很高兴其他人能再次保证,按照要求混合技术不是亵渎神明……(第一部分我的意思是,它不是可伸缩性,而是干净、可读——实际上可以很好地测试——代码和功能是查看这些模式的主要原因)有人愿意解释反对票吗?这似乎是个合理的问题?