FluentValidation с отображением между 2 объектами - PullRequest
0 голосов
/ 22 января 2020

У меня есть список, который мне нужно поддерживать, чтобы все реквизиты были строкой. Но теперь я хотел бы создать новый список, который сопоставляет свойства, и, если проверка не удалась, он установит для свойства IsValid PersonSource значение false и ValidationMessage по причинам, по которым я также могу использовать AutoMapper, если это можно добавить в смесь Мой класс проверки имеет множество данных проверки, которые гарантируют, что есть данные и данные являются соответствующими


 public class PersonSource
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string SomeNumber { get; set; }

        public string BirthDate { get; set; }
        public bool IsValid { get; set; }
        public string ValidationMessage { get; set; }
    }


    public class PersonDest
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int SomeNumber { get; set; }

        public DateTime BirthDate { get; set; }


    }
    public class PersonDestValidator : AbstractValidator<PersonDest>
    {
        public PersonDestValidator()
        {
            RuleFor(x => x.FirstName)
                .NotEmpty()
                .MaximumLength(50);

            RuleFor(x => x.LastName)
                .NotEmpty()
                .MaximumLength(50);

            RuleFor(x => x.BirthDate)
                .LessThan(DateTime.UtcNow);


            RuleFor(x => x.SomeNumber)
                .GreaterThan(0);

        }
    }

1 Ответ

0 голосов
/ 27 января 2020

FluentValidation вернет ValidationResult после того, как вы подтвердите свой PersonDest объект.

Чтобы отобразить этот объект в новом PersonSource объекте, обогащенном результатами проверки, моя первая мысль будет использовать AutoMapper и предоставить пользовательский конвертер типов . Конвертеры пользовательских типов могут взять ResolutionContext, который будет контейнером, который вы будете использовать для получения результатов проверки в процессе отображения.

Метод Convert конвертера будет выглядеть примерно так:

public PersonSource Convert(PersonDest personDest, PersonSource personSource, ResolutionContext context){
    if (personSource == null)
    {
        personSource = new PersonSource();
    }

    if (personDest == null)
    {
        return personSource;
    }

    ... PersonDest to PersonSource mapping

    var validationResult = (ValidationResult)context.Items["ValidationResult"]

    personSource.IsValid = validationResult.IsValid

    if (!validationResult.IsValid)
    {
        personSource.ErrorMessage = string.Join(Environment.NewLine, validationResult.Errors.Select(x => x.ErrorMessage))
    }
}

Свойство ResolutionContext.Mapper обеспечивает доступ к преобразователю, поэтому можно определить базовое отображение c PersonDest to PersonSource в вашем профиле сопоставления и использовать его в преобразователе типов. Вы можете столкнуться с рекурсивным l oop с расширением ConvertUsing. Поэкспериментируйте и дайте нам знать, как вы go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...