using FluentValidation; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stylet.Samples.ModelValidation { public class FluentModelValidator : IModelValidator { private readonly IValidator validator; private T subject; public FluentModelValidator(IValidator validator) { this.validator = validator; } public void Initialize(object subject) { this.subject = (T)subject; } public Task> ValidatePropertyAsync(string propertyName) { var errors = this.validator.Validate(this.subject, propertyName).Errors.Select(x => x.ErrorMessage); return Task.FromResult(errors); } public async Task>> ValidateAllPropertiesAsync() { // If someone's calling us synchronously, and ValidationAsync does not complete synchronously, // we'll deadlock unless we continue on another thread. return (await this.validator.ValidateAsync(this.subject).ConfigureAwait(false)) .Errors.GroupBy(x => x.PropertyName) .ToDictionary(x => x.Key, x => x.Select(failure => failure.ErrorMessage)); } } }