używam biblioteki FluentValidation egzekwować wyjątkową presję na jednym z moich modeli:Wstrzykiwanie DbContext do walidatora 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);
}
}
Wartość ApplicationDbContext
jest wstrzykiwany przy użyciu StructureMap. Aby upewnić się, że kontekst został usunięty na końcu każdego żądania, spróbowałem zadzwonić pod numer ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
w module obsługi EndRequest
dla mojej aplikacji.
Niestety, wygląda na to, że metoda Application_EndRequest
jest wywoływana, zanim moja klasa walidatora będzie w stanie wykonać swoje zadanie, a kontekst zostanie usunięty przed wykonaniem czasu FooValidator.BeUnique
.
Czy istnieje lepszy sposób sprawdzania poprawności zależnej od bazy danych przy użyciu biblioteki FluentValidation, czy też jedynym rozwiązaniem jest przeniesienie tej logiki w inne miejsce (do akcji kontrolera, samej bazy danych, czy może gdzie indziej)?
Być może walidator nie jest scoped http (ale singleton) i nie jest odtworzony/wstrzyknięty nowy kontekst? Więc może próbuje użyć kontekstu z poprzedniego żądania? Po prostu zgaduję, że nie znam StructureMap konkretnie. –
Twój komentarz był poprawny, klasy sprawdzania poprawności były dostępne w Singleton. Chcesz zgłosić to jako odpowiedź, aby móc przyznać kredyt? –