8

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

+0

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

+0

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

Répondre

7

Peut-être que le validateur n'est pas une portée http (mais singleton) et n'est pas recréé/injecté avec un nouveau contexte? Dans ce cas, il essaie d'utiliser un contexte éliminé à partir d'une requête précédente.

Questions connexes