In MVC, posso creare un validatore del modello che può assumere dipendenze. Normalmente utilizzo FluentValidation per questo. Questo mi permette di, per esempio, verifico registrazione conto che un indirizzo e-mail non è stata utilizzata (NB: Questo è un esempio semplificato!): EsisteConvalida iniettata dalla dipendenza nell'API Web
public class RegisterModelValidator : AbstractValidator<RegisterModel> {
private readonly MyContext _context;
public RegisterModelValidator(MyContext context) {
_context = context;
}
public override ValidationResult Validate(ValidationContext<RegisterModel> context) {
var result = base.Validate(context);
if (context.Accounts.Any(acc => acc.Email == context.InstanceToValidate.Email)){
result.Errors.Add(new ValidationFailure("Email", "Email has been used"));
}
return result;
}
}
Nessun tale integrazione per l'API Web con FluentValidation . Ci sono stati uno couple di attempts a questo, ma nessuno dei due ha affrontato l'aspetto di Dependency Injection e funziona solo con validatori statici.
Il motivo per cui questo è difficile è dovuto alla diversa implementazione di ModelValidatorProvider e ModelValidator tra MVC e Web API. In MVC, questi sono istanziati per richiesta (quindi l'iniezione di un contesto è semplice). In Web API, sono statici e ModelValidatorProvider mantiene una cache di ModelValidators per tipo, per evitare inutili ricerche di riflessioni su ogni richiesta.
Ho cercato di aggiungere l'integrazione necessaria, ma sono stato stuck trying to obtain the Dependency Scope. Invece, ho pensato di fare un passo indietro e chiedere se ci sono altre soluzioni al problema - se qualcuno ha escogitato una soluzione per eseguire la validazione del modello in cui le dipendenze possono essere iniettate.
NON voglio eseguire la convalida all'interno del Controller (sto utilizzando un ValidationActionFilter per tenerlo separato), il che significa che non posso ottenere alcun aiuto dall'iniezione del costruttore del controller.
Questa è una domanda eccellente in quanto sembra che tu abbia davvero fatto la tua ricerca prima di chiedere.Non sono abbastanza sicuro che al momento in cui è stata posta questa domanda tu stavi davvero lottando con l'essere in grado di iniettare dipendenze, o se il problema era che a causa della memorizzazione nella cache che si verificava che qualsiasi dipendenza iniettata non sarebbe stata risolta ogni volta la validazione viene eseguita. Questa è la situazione in cui si è scontrata la mia squadra per la quale ho aperto un problema con FluentValidation: https://github.com/JeremySkinner/FluentValidation/issues/108. La tua soluzione qui sotto potrebbe essere una soluzione praticabile per noi. –
Li ho appena messi su nuget se si desidera utilizzarli – Richard