Używam biblioteki FluentValidation do wymuszania unikalnego ograniczenia na jednym z moich modeli:
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);
}
}
The ApplicationDbContext
wartość jest wstrzykiwana za pomocą StructureMap. Aby upewnić się, że kontekst zostanie usunięty na końcu każdego żądania, spróbowałem zadzwonić ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
w EndRequest
obsługi dla mojej aplikacji.
Niestety wygląda na to, że Application_EndRequest
metoda jest wywoływana, zanim moja klasa walidatora będzie w stanie wykonać swoją pracę, a kontekst zostanie usunięty do czasu FooValidator.BeUnique
jest wykonywany.
Czy istnieje lepszy sposób na wykonanie?zależne od bazy danych zatwierdzenia z biblioteką FluentValidation, czy też jedynym rozwiązaniem pozwalającym przenieść tę logikę w inne miejsce (do działania kontrolera, samej bazy danych, czy może gdzie indziej)?
Odpowiedzi:
7 dla odpowiedzi № 1Może walidator nie ma zasięgu http (ale singleton) i nie jest odtwarzany / wtryskiwany z nowym kontekstem? W tym przypadku próbuje użyć ujętego kontekstu z poprzedniego żądania.