我有一个基于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
注册为一个范围依赖项。为了重新尝试方法逻辑,我需要一个新的AppDbContext
实例,但被注册为范围的将不允许这样做。我想到的一个解决方案是使
AppDbContext
成为临时的。但我有一种感觉,这样做会为自己带来全新的问题。有人能帮我吗?