0

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()しかし、私のテストの1つは、メソッドがパラメーターとして受け入れることができなかったと言って失敗し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、エラーをデバッグするためのコンソールアプリケーションを作成するためにインストールできません。それ以来、単体テスト内でデバッグする方法がわかりません。あるいは、説明があればいいのにと思います!

ありがとう!

4

2 に答える 2

2

このトピックは古いですが、私は有用であることがわかり、少し異なったものになりました。

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;
于 2018-09-24T01:27:37.380 に答える
0

Ok!

したがって、私の問題の解決策は次のとおりです(少なくともこれは期待どおりに機能します):

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();
    }
}
于 2011-12-30T11:06:24.833 に答える