8

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

+0

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

+0

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

Odpowiedz

7

Być może walidator nie jest scoped http (ale singleton) i nie jest odtworzony/wstrzyknięty nowy kontekst? W tym przypadku próbuje użyć ujętego kontekstu z poprzedniego żądania.

Powiązane problemy