【问题标题】:Cqrs Complex commands for master detail tables主从表的 Cqrs 复杂命令
【发布时间】:2015-03-26 13:13:06
【问题描述】:

我有一个 CreateUserCommand 负责创建帐户。

   public class UserCommandHandler : ICommandHandler<CreateUserCommand>
    {
        private readonly IUserRepository repository;

        public UserCommandHandler(IUserRepository repository)
        {
            this.repository = repository;
        }

        public void Handle(CreateUserCommand command)
        {
            User user = new User();
            user.Username = command.Username;
            user.Password = command.Password;
            user.Email = command.Email;

            repository.Add(user);
            repository.Save();
        }
    }

但我有包含 (UserId, RoleID) 列的 UserInRoles 表。所以我必须在创建后将用户添加到角色中。

如何使用 CQRS 进行这种嵌套操作?

【问题讨论】:

  • 所以你们都有一个 Users 和一个 UserInRoles 表,而不仅仅是上面代码中缺少的 RoleId 值,对吗?

标签: design-patterns domain-driven-design cqrs


【解决方案1】:

UserCommandHandler 在创建和存储用户对象方面似乎做得很好,但它并不能很好地反映您的用例。例如,您的用例会导致“注册用户创建一个新用户对象并分配新用户角色 X”。

然后我会创建一个RegisterUser 域服务(或将这个名称的方法放入适当的现有服务中)。由于“注册” new 不仅仅意味着“创建用户对象”,因此可以一次性完成。

如果单独使用 UserCommandHandler 不会违反您的业务规则,您甚至可以重新使用它——即,如果在所有情况下都禁止创建用户而不赋予他们角色,则不要提供只创建用户对象的机制。将UserCommandHandler 替换为上述RegisterUser

我建议你看看Vernon's TenantProvisioningService 以获得灵感。

在那里,registerAdministratorFor 创建一个包含所有嵌套值对象的用户,创建一个管理员角色,并将新用户分配给该角色。

【讨论】:

    【解决方案2】:

    如果用户必须有一个角色并且有一个默认角色,那么您可以将默认角色作为CreateUserCommand 的一部分插入到角色表中

    如果用户必须具有角色但没有默认角色,则在CreateUserCommand 中包含该用户必须具有的角色,并将记录作为命令的一部分添加到表中。 (您也可以添加角色列表以将用户添加到CreateUserCommand,如果它为空,则使用默认角色,否则使用明确定义的角色)

    如果用户不必具有角色,那么您可以执行上述 2 个选项之一,或者您可以添加一个新命令 AddUserToRole(s)Command 并让客户端在创建用户后发出这些命令。

    如果您的角色和用户位于不同的存储库中,您的命令处理程序可以依赖于这两个存储库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2013-03-31
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多