我正在使用 FluentValidation 库对我的一个模型强制执行唯一约束:
public class Foo {
// No two Foos can have the same value for Bar
public int Bar { get; set; }
}
public class FooValidator : AbstractValidator<Foo> {
public FooValidator(ApplicationDbContext context) {
this.context = context;
RuleFor(m => m.Bar)
.Must(BeUnique).WithMessage("Bar must be unique!");
}
private readonly ApplicationDbContext context;
public bool BeUnique(int bar) {
return !context.Foos.Any(foo => foo.Bar == bar);
}
}
该ApplicationDbContext
值是使用 StructureMap 注入的。为了确保在每个请求结束时处理上下文,我尝试为我的应用程序调用ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
处理EndRequest
程序。
不幸的是,似乎Application_EndRequest
在我的验证器类能够完成其工作之前调用了该方法,并且在FooValidator.BeUnique
执行时上下文已被释放。
有没有更好的方法来使用 FluentValidation 库执行依赖于数据库的验证,或者是将这个逻辑移到其他地方(控制器操作、数据库本身或其他地方)的唯一解决方案?