我有 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进行这种排空操作?
答案 0 :(得分:1)
UserCommandHandler
似乎确实在创建用户对象并存储它方面做得很好,但它并不能很好地反映您的用例。例如,您的用例会导致“注册用户创建新用户对象并分配新用户角色 X ”。
然后我创建一个RegisterUser
域服务(或将此名称的方法放入适当的现有服务中)。由于“注册”新手段不仅仅意味着“创建用户对象”,因此可以在一次扫描中同时执行这两项操作。
你甚至可以重新使用UserCommandHandler
,如果它本身不会违反你的业务规则 - 即如果禁止创建用户而不是在所有情况下都让他们发挥作用,那就不要提供一种只创建用户对象的机制。将UserCommandHandler
替换为前面提到的RegisterUser
。
我建议你看一下Vernon's TenantProvisioningService的灵感。
在那里,registerAdministratorFor
创建一个拥有所有嵌套值对象的用户,创建一个管理员角色,并将新用户分配给该角色。
答案 1 :(得分:0)
如果用户必须拥有角色并且有默认角色,那么您可以将默认角色作为CreateUserCommand
如果用户必须具有角色但没有默认角色,则包括用户必须在CreateUserCommand
中的角色,并将该记录作为命令的一部分添加到表中。 (您也可以添加角色列表以将用户添加到CreateUserCommand
,如果它是空的,只需使用默认角色,否则使用明确定义的角色)
如果用户没有角色,那么您可以执行上述2个选项中的任何一个,或者您可以添加新命令AddUserToRole(s)Command
并让客户端在创建用户后发出这些命令。
如果您的角色和用户位于不同的存储库中,您的命令处理程序可以依赖于两个存储库。