在 CQ(R)S 中,可以将命令用作模型构造函数的参数吗?

In CQ(R)S, is it OK to use a Command as a parameter of a model constructor?

假设我有一个 CreateUser 命令:

class CreateUser
{
    public string $email;
    public string $password;
    public string $firstName;
    public string $lastName;
    public LocalDate $dateOfBirth;
    public ?string $location;
}

如果我的 User 模型接受此命令作为构造函数参数是否可以?

即而不是这个:

class User
{
    public function __construct(
        string $email,
        string $password,
        string $firstName,
        string $lastName,
        LocalDate $dateOfBirth,
        ?string $location
    ) {
       ...

并让命令处理程序将命令数据映射到模型,我可以简单地让模型构造函数接受命令作为参数并提取他们需要的数据:

class User
{
    public function __construct(CreateUser $command)
    {
        ...
}

这是正确的方法还是有缺点?

Is this a correct approach, or are there drawbacks?

小缺点。

缺点 #1 - 您添加了一个(小的)额外工作步骤。如果我想要一个用户,我首先必须获得一个 CreateUser 命令。所以还有一个额外的步骤。

缺点 #2 - 因为您需要一个 CreateUser,所以您需要 User User 不关心的所有额外字段的所有字段的值。

例如,假设您后来决定 CreateUser 应该有一个 messageId。现在,想要 User 的代码路径需要发明一个他们不想要的 messageId,以便构造一个他们不想要的 CreateUser,这样他们就可以构造他们想要的 User。

想要一个接受 CreateUser 和 returns User 的函数是完全合理的。您甚至希望该功能接近 User 也是合理的。

不过,您可能不希望该函数成为 __construct。 static helper method 可能是更健康的长期解决方案。