用于主详细信息表的Cqrs Complex命令

时间:2015-03-26 13:13:07

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

我有 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();
        }
    }

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

如何使用CQRS进行这种排空操作?

2 个答案:

答案 0 :(得分:1)

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

然后我创建一个RegisterUser域服务(或将此名称的方法放入适当的现有服务中)。由于“注册”新手段不仅仅意味着“创建用户对象”,因此可以在一次扫描中同时执行这两项操作。

你甚至可以重新使用UserCommandHandler,如果它本身不会违反你的业务规则 - 即如果禁止创建用户而不是在所有情况下都让他们发挥作用,那就不要提供一种只创建用户对象的机制。将UserCommandHandler替换为前面提到的RegisterUser

我建议你看一下Vernon's TenantProvisioningService的灵感。

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

答案 1 :(得分:0)

如果用户必须拥有角色并且有默认角色,那么您可以将默认角色作为CreateUserCommand

的一部分插入角色表中

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

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

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