根据 CQRS 模式,我有一个简单的命令,如下所示:
public sealed class EditPersonalInfoCommandHandler : ICommandHandler<EditPersonalInfoCommand> {
private readonly AppDbContext _context;
public EditPersonalInfoCommandHandler(AppDbContext context) {
_context = context;
}
public Result Handle(EditPersonalInfoCommand command) {
var studentRepo = new StudentRepository(_context);
Student student = studentRepo.GetById(command.Id);
if (student == null) {
return Result.Failure($"No Student found for Id {command.Id}");
}
student.Name = command.Name;
student.Email = command.Email;
_context.SaveChanges();
return Result.Success();
}
}
_context.SaveChanges()
现在我有一个要求,如果它因异常而失败,则最多尝试5 次。为此,我可以简单地在方法中有一个 for 循环:
for(int i = 0; i < 5; i++) {
try {
//required logic
} catch(SomeDatabaseException e) {
if(i == 4) {
throw;
}
}
}
要求是将方法作为一个单元执行。问题是,一旦_context.SaveChanges()
抛出异常,_context
就不能用同样的方法重新尝试逻辑。文档说:
丢弃当前的 DbContext。创建一个新的 DbContext 并从数据库中恢复应用程序的状态。通知用户上一个操作可能没有成功完成。
但是,在 中Startup.cs
,我有AppDbContext
as 范围的依赖项。为了重新尝试方法逻辑,我需要一个新的实例,AppDbContext
但被注册为作用域将不允许这样做。
我想到的一种解决方案是制作AppDbContext
瞬态。但我有一种感觉,通过这样做,我将为自己打开一整套新问题。有人可以帮我吗?