8

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)?

+0

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. –

+0

Il tuo commento era corretto, le classi di validazione erano ad ambito Singleton. Vuoi inviarlo come risposta in modo da poterlo accreditare? –

risposta

7

Forse il validatore non è http scope (ma singleton) e non viene ricreato/iniettato con un nuovo contesto? In questo caso tenta di utilizzare un contesto disposto da una richiesta precedente.