FluentValidation документирует правила валидации

Я унаследовал множество валидаторов FluentValidation, которые мне нужно задокументировать и протестировать. Документация должна содержать модель, имя свойства, минимальную/максимальную длину, нуль/не нуль, минимальные/максимальные значения, сообщение об ошибке. Я пытаюсь написать код, чтобы сделать это для меня.

Я думал об использовании какого-то отражения или свойства в валидаторе, но я не видел, чтобы его можно было использовать.

Мои валидаторы выглядят так

public class MyValidator: AbstractValidator<myClass>
{
   public MyValidator()
       {
          RuleFor(a=>a.Name)
          .NotNull().WithMessage(s=> "Hello World");
       }
}

Если бы кто-то мог указать мне в правильном направлении, это было бы оценено.


person BBK    schedule 10.03.2020    source источник
comment
Что будет сказано в документации, чего еще нет в коде C#?   -  person Greg Burghardt    schedule 10.03.2020
comment
Ваше время лучше потратить на написание модульных тестов для валидаторов. У FluentValidation есть несколько методов расширения, упрощающих тестирование: docs.fluentvalidation.net/en/latest/ test.html   -  person Greg Burghardt    schedule 10.03.2020
comment
Помимо тестов, мой клиент хочет список правил в документе Excel. :(   -  person BBK    schedule 12.03.2020
comment
Ok. Теперь я понимаю. Это может быть вопрос, на который можно ответить, если вы добавите его в текст вопроса. Можете ли вы рассказать нам больше о том, что ваш клиент ожидает от документации? Можете ли вы опубликовать код, который вы пробовали?   -  person Greg Burghardt    schedule 12.03.2020


Ответы (1)


Я не смог найти способ сделать это, опросив код валидатора, поэтому в итоге я прочитал и интерпретировал файлы валидатора. Это не так, как мне хотелось бы, но это позволяет мне удовлетворить требования клиентов.

Обновление, июль 2021 г. Я еще раз взглянул на это, и есть лучший способ сделать это, используя отражение. Несколько условий для каждого правила хранятся в свойстве, называемом компонентами.

 var assembly = Assembly.LoadFrom(AssemblyPath);
foreach (Type validatorType in assembly.GetTypes().Where(m => m.BaseType.Name.StartsWith("AbstractValidator")))
{
    var validatorClass = Activator.CreateInstance(validatorType, true);
    var rules = (IEnumerable)RefelctInstanceProperty(validatorClass, "Rules");
    var _innerCollection = (IEnumerable)ReflectInstanceField(rules, "_innerCollection");
    foreach (IValidationRule rule in _innerCollection)
    {
        var member = rule.Member;
        string propertyName = rule.Member.Name;
        var propertyType = rule.TypeToValidate.FullName;
        var modelType = rule.Member.DeclaringType.FullName;
        string expression = rule.Expression.ToString();
        foreach (FluentValidation.Internal.IRuleComponent component in rule.Components)
        {
            string errormessage = component.GetUnformattedErrorMessage();
            IPropertyValidator componentValidator = component.Validator;

            Console.WriteLine($"| {modelType.PadRight(50, ' ')} | {propertyName.PadRight(20, ' ')} | {propertyType.PadRight(30, ' ')} | {expression} | {errormessage} |");
            Console.WriteLine($"| {"".PadRight(73, ' ')} | {componentValidator.Name.PadRight(30, ' ')} |");
        }
    }
}

Рабочую демонстрацию можно найти на GitHub @ https://github.com/CodeTile/Test.FluentValidation.Validators

person BBK    schedule 12.03.2020
comment
Честно говоря, наверное, самый простой, если это управляемо. Можно получить нужную информацию, начиная с validator.CreateDescriptor(), вы получаете доступ к свойствам, которые имеют правила, детали, наборы правил, в которых они находятся, и т. д., но для построения общей картины того, что делает валидатор, требуется много усилий. . Затем, когда у вас есть метод, который делает это за вас, вам понадобится способ создать экземпляр всех валидаторов в вашем решении для его запуска; Я бы, вероятно, создал поставщика услуг и использовал scrutor, чтобы обнаружить их все. Много усилий для того, что, вероятно, является одноразовым. - person rgvlee; 12.03.2020