Sto usando la libreria FluentValidation per imporre un vincolo univoco su uno dei miei modelli:Iniettando un DbContext in un validatore 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);
}
}
Il valore ApplicationDbContext
viene iniettato utilizzando StructureMap. Per assicurarmi che il contesto sia stato eliminato alla fine di ogni richiesta, ho tentato di chiamare ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
nel gestore EndRequest
per la mia applicazione.
Sfortunatamente, sembra che il metodo Application_EndRequest
venga chiamato prima che la mia classe di validatore sia in grado di eseguire il proprio lavoro e il contesto sia eliminato dall'ora FooValidator.BeUnique
.
Esiste un modo migliore per eseguire convalide dipendenti dal database con la libreria FluentValidation oppure è l'unica soluzione per spostare altrove questa logica (sia per l'azione del controller, il DB stesso o forse altrove)?
Forse il validatore non è http scope (ma singleton) e non viene ricreato/iniettato con un nuovo contesto? Quindi forse prova ad usare un contesto disposto da una richiesta precedente? Solo a indovinare, non conosco StructureMap concretamente. –
Il tuo commento era corretto, le classi di validazione erano ad ambito Singleton. Vuoi inviarlo come risposta in modo da poterlo accreditare? –