/ / Wstrzykiwanie DbContext do walidatora FluentValidation - entity-framework, asp.net-mvc-3, iniekcja zależności, structuremap, fluentwalacja

Wstrzyknięcie DbContext do walidatora FluentValidation - framework-entity, asp.net-mvc-3, iniekcja zależności, structuremap, fluentwalacja

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 № 1

Moż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.