gpt4 book ai didi

unit-of-work - CQRS:ICommandHandler 是否应该负责调用 IUnitOfWork 上的 SaveChanges()?

转载 作者:行者123 更新时间:2023-12-02 03:35:36 25 4
gpt4 key购买 nike

假设我有一个命令处理程序:

public class AddNewUserCommandHandler : ICommandHandler<AddNewUserCommand>
{
//IUserManagementUnitOfWork implements IUnitOfWork.SaveChanges()
//hold references to related repositories
//basically an abstraction over DbContext/DbSet
private IUserManagementUnitOfWork uow;

public AddNewUserCommandHandler(IUserManagementUnitOfWork uow)
{
this.uow = uow;
}

public void Handle(AddNewUserCommand command)
{
var user = new User
{
FirstName = command.FirstName,
LastName = command.LastName
};
uow.UserRepository.Add(user);
uow.SaveChanges(); //should this be here?
command.UserId = user.Id;
}
}

我的问题是:应该 ICommandHandler<TCommand>负责调用SaveChanges()IUnitOfWork 上?或者这应该是调用者的责任?

例如,AddNewUserCommandHandler只会有 IRepository<User>作为其依赖项,调用者将持有对 IUnitOfWork 的引用并调用SaveChanges()当它感觉像它的时候。来电者可能是 ICommandProcessor可以处理多个 ICommand s 并调用 SaveChanges当所有命令都由其处理程序成功处理时。

或者,留下 SaveChanges()义务ICommandHandler<TCommand>并将批处理命令处理器包装在 TransactionScope 中, 并委托(delegate) command.UserId = user.Id到将在调用 TransactionScope.Complete() 后执行的事件.

哪种方法更好?

谢谢!

最佳答案

我已经实现了一个与 ddd-cqrs-sample 非常相似的设置.有一个“运行环境”类负责使用相应的命令处理程序运行命令。除此之外,我的 RE 实现了事务边界。它负责启动一个工作单元,并根据命令的结果在命令执行后执行提交/回滚。

当然这取决于您的用例。如果您的命令的行为大致相同,也许您的调用类可以构成事务边界。我认为在大多数情况下,人们应该尝试建立这样的命令设计,以便拥有简单且专注于一项任务的命令。

关于unit-of-work - CQRS:ICommandHandler<TCommand> 是否应该负责调用 IUnitOfWork 上的 SaveChanges()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23623699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com