Интеграция валидатора FluentValidation с базовым классом сущностей - PullRequest
0 голосов
/ 29 декабря 2011

Я хочу использовать AbstractValidator<T> внутри базового класса сущности.

[Serializable]
public abstract class Entity<T> where T : Entity<T>
{
    public virtual Boolean Validate(AbstractValidator<T> validator)
    {
        return validator.Validate(this as ValidationContext<T>).IsValid;
    }
    // other stuff..
}

Но один из моих тестов не прошел, сказав, что метод Validate() не может принять null в качестве параметра.

[Test]
public void CategoryDescriptionIsEmpty()
{
    var category = new Category
    {
        Title = "some title",
        Description = String.Empty
    };

    Assert.False(category.Validate(this.validator) == true);
}

[SetUp]
public void Setup()
{
    this.validator = new CategoryValidator();
}

Я использую Visual Web Developer и в настоящее время не могу установить C# Developer Express для создания консольного приложения для отладки ошибки. С тех пор я не знаю, как мне отладить внутри модульного теста. В качестве альтернативы было бы здорово, если бы можно было дать какое-то объяснение!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 сентября 2018

Эта тема старая, но я нашел полезной и немного отличной:

public abstract class WithValidation<V> where V : IValidator
    {

        private IValidator v = Activator.CreateInstance<V>();

        public bool IsValid => !(Errors.Count() > 0);

        public IEnumerable<string> Errors
        {
            get
            {
                var results = v.Validate(this);

                List<string> err = new List<string>();

                if (!results.IsValid)
                    foreach (var item in results.Errors)
                        err.Add(item.ErrorMessage);

                return err;

            }
        }
    }

public class Client : WithValidation<ClientValidator>
    {

        public Guid Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

    }

public class ClientValidator : AbstractValidator<Client>
    {

        public ClientValidator()
        {
            RuleFor(c => c.Name).NotNull();
            RuleFor(c => c.Age).GreaterThan(10);
        }


    }

Так что теперь вы можете использовать проще, например:

Client c = new Client();

var isvalid = c.IsValid;

IList<string> errors = c.Errors;
0 голосов
/ 30 декабря 2011

Хорошо!

Итак, решение моей проблемы следующее (по крайней мере, это работает, как и ожидалось):

public abstract class Entity<T> where T : Entity<T>
{
    public Boolean IsValid(IValidator<T> validator)
    {
        // var context  = new ValidationContext(this);
        // var instance = context.InstanceToValidate as T;
        // return validator.Validate(instance).IsValid;

        return validator.Validate(this as T).IsValid;
    }
}
public class Rambo : Entity<Rambo>
{
    public Int32 MadnessRatio { get; set; }
    public Boolean CanHarmEverything { get; set; }
}   
public class RamboValidator : AbstractValidator<Rambo>
{
    public RamboValidator()
    {
        RuleFor(r => r.MadnessRatio).GreaterThan(100);
    }
}

class Program
{
    public static void Main(String[] args)
    {
        var ramboInstance = new Rambo {
            MadnessRatio = 90
        };          

        Console.WriteLine("Is Rembo still mad?");
        Console.WriteLine(ramboInstance.IsValid(new RamboValidator()));

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