存储库 return 的创建方法应该是什么类型?

What is the type should the create method of the repository return?

我正在尝试实现 CQRS 模式。

按照 CQRS 模式,Command 应该 return 什么都没有,因为 void 在 Java 中输入。

存储库中的 create() 方法是我认为的命令,它应该 return 没有遵循该模式。

但我正在努力构建需要创建和使用新实体的函数。

例如,我必须构建一个函数assign new child category。在此功能中,客户端可以将 parent category idnew child details 发送到服务器。

parent category id是一个简单的案例,但问题是在new child details案例中。

我必须先根据详细信息创建一个新类别,然后使用该实体为其分配父 ID,最后保存它。目前,我无法获取新创建的实体,因为 create() 方法 return 什么都没有。

而且我无法创建新实体,分配父 ID 并保存它,因为没有 ID 无法创建实体,而 ID 仅由我使用的 ORM 分配。


我应该怎么做才能解决这个问题?存储库 return 的方法 create()void 以外的实体是否违反了 CQRS 模式?

这取决于场景和业务需求。所有的设计模式、方法等只是让您了解常见问题的可能解决方案。没有一个好的原则可以适用于不同业务问题的所有场景。如果在执行命令后,每次都需要根据结果执行一些逻辑 - 那么 return 那个结果可以避免不必要的调用。这完全取决于您尝试解决的问题和您准备做出的权衡。

有关更多信息,您可以查看此

Following the CQRS pattern, the Command should return nothing, as the void type in Java.

我不知道这是从哪里来的,多年来人们一直相信这一点,但事实并非如此。

对于实体创建,或者你告诉存储要存储的新事物的 id,或者它为你创建它并且你可以将它(或整个实体)作为 return,它不会'违反任何规定。

返回实体不违反 CQRS 模式。

在您的命令模型中添加:

public record CreateCommand : IRequest<ModelVm>

ModelVm 是您要return 的模型。

并在您的 CommandHandler class 中添加此代码:

public class CreateCommandHandler : IRequestHandler<CreateCommand, ModelVm>

而不是 returning Unit.Value 你应该 return ModelVm in CreateCommandHandler.