J'utilise la bibliothèque de FluentValidation pour faire appliquer une contrainte unique sur l'un de mes modèles:Injecter un DbContext dans un validateur 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);
}
}
La valeur ApplicationDbContext
est injecté à l'aide StructureMap. Pour m'assurer que le contexte est éliminé à la fin de chaque requête, j'ai tenté d'appeler le ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()
dans le gestionnaire EndRequest
pour mon application.
Malheureusement, il semble que la méthode Application_EndRequest
est appelée avant que ma classe de validateur puisse effectuer son travail et que le contexte soit éliminé au moment où le FooValidator.BeUnique
est exécuté. Existe-t-il un meilleur moyen d'effectuer des validations dépendantes de la base de données avec la bibliothèque FluentValidation, ou est la seule solution pour déplacer cette logique ailleurs (soit à l'action du contrôleur, la DB elle-même, ou ailleurs)?
Peut-être que le validateur n'a pas de portée http (mais singleton) et qu'il n'est pas recréé/injecté avec un nouveau contexte? Alors peut-être qu'il essaie d'utiliser un contexte éliminé d'une demande précédente? Je devine, je ne connais pas StructureMap concrètement. –
Votre commentaire était correct, les classes de validation étaient Singleton portée. Voulez-vous soumettre cela comme une réponse pour que je puisse lui donner crédit? –