مقایسه DataAnnotation با FluentApiValidation

👈 در این مقاله می‌خواهیم ببینیم چه راهی برای ولیدیت کردن آبجکت‌هامون بهتره، DataAnnotation یا FluentApiValidation


👁 بازدید : 16

1403/6/31 | 23:27 : تاریخ 📆


برای اینکه بتونیم یه تست خوب از مقایسه DataAnnotation با FluentApiValidation بگیریم میریم سراغ ساختن دو تا کلاس که تو هرکدومش از یکیش استفاده میکنیم.

اول DataAnnotation :

public class DataAnotationValidation
{
    [Required(ErrorMessage ="Email is required.")]
    [EmailAddress(ErrorMessage ="Please Enter a valid email address.")]
    public string Email { get; set; }
}

 

و کلاسی برای FluentApiValidation :

public class FluentApiValidation
{
    public string Email { get; set; }
}

و حالا کانفیگ مربوط به کلاس FluentApiValidation، که برای اینکار لازمه پکیج FluentValidation رو نصب کنید :

 public class FluentValidator : AbstractValidator<FluentApiValidation>
 {
     public FluentValidator() 
     {
         RuleFor(a=>a.Email)
             .NotEmpty().WithMessage("Email is rrequired.")
             .EmailAddress().WithMessage("Please enter a valid email address.");
     }
 }

یکی از مزیت‌هایی که معمولا به FluentValidation نسبت میدن همین جدا بودن کانفیگ‌های ولیدیشن و آبجکت هست که خیلی کلاس مربوط به آبجکت رو شلوغ و در هم برهم نمیکنه، اما در نهایت چیزی که خیلی مهمه مقایسه پرفورمنس این دو روشه که در یک کلاس دیگه از بنچمارک کمک گرفتم تا مقایسه کامل‌تری داشته باشم.

کلاس  ValidationBenchmark :

public class ValidationBenchmark
{
    private readonly DataAnotationValidation _dataValidation;
    private readonly FluentApiValidation _fluentValidation;
    public ValidationBenchmark()
    {
        _dataValidation = new DataAnotationValidation
        {
            Email = "test@test.com"
        };
        _fluentValidation = new FluentApiValidation
        {
            Email = "test@test.com"
        };
    }

    [Benchmark]
    public void DataAnnotationValidation()
    {
        for (int i = 0; i < 100; i++)
        {
            Validator.ValidateObject(_dataValidation,new ValidationContext(_dataValidation),true);
        }
    }

    [Benchmark]
    public void FluentValidation()
    {
        for (int i = 0; i < 100; i++)
        {
            var validation = new FluentValidator();
            validation.Validate(_fluentValidation);
        }
    }
}

من تو یه لوپ صدتایی اومدم چک کردم که کدوم روش پرفورمنس بهتری داره تا ازش استفاده کنم

و اما خروجی :

همینطور که میبینیم روش DataAnnotation (32نانو ثانیه) تقریبا دوبرابر FluentApiValidation(75نانو ثانیه) پرفورمنس بهتری به ما میده و احتمالا خیلی خوشمون نیاد که بخواهیم زیاد سراغ FluentApiValidation بریم!

نتیجه گیری :

اما به هر حال FluentApiValidationیه روش جالبی هست که میتونه برای ولیدیشن‌های پیچیده کاربردی تر باشه و بیشتر به ما کمک کنه.

برای اینکه بتونیم یه تست خوب از مقایسه DataAnnotation با FluentApiValidation بگیریم میریم سراغ ساختن دو تا کلاس که تو هرکدومش از یکیش استفاده میکنیم.

اول DataAnnotation :

public class DataAnotationValidation
{
    [Required(ErrorMessage ="Email is required.")]
    [EmailAddress(ErrorMessage ="Please Enter a valid email address.")]
    public string Email { get; set; }
}

 

و کلاسی برای FluentApiValidation :

public class FluentApiValidation
{
    public string Email { get; set; }
}

و حالا کانفیگ مربوط به کلاس FluentApiValidation، که برای اینکار لازمه پکیج FluentValidation رو نصب کنید :

 public class FluentValidator : AbstractValidator<FluentApiValidation>
 {
     public FluentValidator() 
     {
         RuleFor(a=>a.Email)
             .NotEmpty().WithMessage("Email is rrequired.")
             .EmailAddress().WithMessage("Please enter a valid email address.");
     }
 }

یکی از مزیت‌هایی که معمولا به FluentValidation نسبت میدن همین جدا بودن کانفیگ‌های ولیدیشن و آبجکت هست که خیلی کلاس مربوط به آبجکت رو شلوغ و در هم برهم نمیکنه، اما در نهایت چیزی که خیلی مهمه مقایسه پرفورمنس این دو روشه که در یک کلاس دیگه از بنچمارک کمک گرفتم تا مقایسه کامل‌تری داشته باشم.

کلاس  ValidationBenchmark :

public class ValidationBenchmark
{
    private readonly DataAnotationValidation _dataValidation;
    private readonly FluentApiValidation _fluentValidation;
    public ValidationBenchmark()
    {
        _dataValidation = new DataAnotationValidation
        {
            Email = "test@test.com"
        };
        _fluentValidation = new FluentApiValidation
        {
            Email = "test@test.com"
        };
    }

    [Benchmark]
    public void DataAnnotationValidation()
    {
        for (int i = 0; i < 100; i++)
        {
            Validator.ValidateObject(_dataValidation,new ValidationContext(_dataValidation),true);
        }
    }

    [Benchmark]
    public void FluentValidation()
    {
        for (int i = 0; i < 100; i++)
        {
            var validation = new FluentValidator();
            validation.Validate(_fluentValidation);
        }
    }
}

من تو یه لوپ صدتایی اومدم چک کردم که کدوم روش پرفورمنس بهتری داره تا ازش استفاده کنم

و اما خروجی :

همینطور که میبینیم روش DataAnnotation (32نانو ثانیه) تقریبا دوبرابر FluentApiValidation(75نانو ثانیه) پرفورمنس بهتری به ما میده و احتمالا خیلی خوشمون نیاد که بخواهیم زیاد سراغ FluentApiValidation بریم!

نتیجه گیری :

اما به هر حال FluentApiValidationیه روش جالبی هست که میتونه برای ولیدیشن‌های پیچیده کاربردی تر باشه و بیشتر به ما کمک کنه.

تمامی‌حقوق‌مادی‌ومعنوی‌این‌سایت‌برای‌یادمیگیریم‌محفوظ است.