Skip to content

Instantly share code, notes, and snippets.

@Mirsalim3635
Created August 3, 2025 12:08
Show Gist options
  • Select an option

  • Save Mirsalim3635/243d09768aaa2ef95485fbb0519b68fc to your computer and use it in GitHub Desktop.

Select an option

Save Mirsalim3635/243d09768aaa2ef95485fbb0519b68fc to your computer and use it in GitHub Desktop.
Fluent-Validation

✅ FluentValidation

🔹 Kirish

FluentValidation bu - C# dasturida foydalanuvchidan olingan ma'lumotlarni mahsus qoidalar asosida tekshiradigan kutubhona



🔹 Asosiy tushuncha

FluentValidation’da siz har bir model yoki DTO uchun alohida validator klass yaratasiz. Har bir validator klass AbstractValidator<T> dan meros oladi va unda RuleFor(...) metodlari orqali validatsiya qoidalari ketma-ket yoziladi.

Bu klasslar faqat sintaksis jihatdan emas, semantik jihatdan ham kuchli: ular kodni o‘qiladigan shartlar matniga aylantiradi.

RuleFor(x => x.Email)
    .NotEmpty().WithMessage("Email bo‘sh bo‘lmasligi kerak.")
    .EmailAddress().WithMessage("Email noto‘g‘ri formatda.");

Bu nafaqat tekshiruv, balki inson o‘qiy oladigan "dasturiy qonunlar" dir.



🔹 Texnik imkoniyatlari

FluentValidation imkoniyatlarini 5 ta toifa orqali baholash mumkin:


1. Ifodali qoidalar sintaksisi (Fluent API)

Qoidalar zanjirsimon (chainable) metodlar orqali aniqlanadi. Bu validatsiyani deklarativ va o‘qiladigan qiladi.



2. Shartli va kontekstli tekshiruvlar

Qoidalarni holatlarga qarab qo‘llash mumkin:

RuleFor(x => x.Discount)
    .GreaterThan(0).When(x => x.IsStudent);


3. Kapsulatsiyalangan (reusable) qoidalar

Har qanday qoidani CustomValidator sifatida alohida komponentga ajratish mumkin.



4. Nested va kolleksiyalarni validatsiya qilish

RuleFor(x => x.Address).SetValidator(new AddressValidator());


5. Asenkron validatsiya

Tashqi xizmatlar bilan ishlash uchun:

RuleFor(x => x.Email)
    .MustAsync(async (email, cancellation) => await userService.IsEmailUnique(email));


🔹 Loyihaviy yondashuv: Validator — Service emas, Layer

Professional yondashuvda validator bu — kirish darajasidagi mustaqil qatlam. Uning vazifasi:

  • DTO’ni domen modelga aylantirishdan oldin filtrlash;
  • Kirish ma’lumotlarining ishonchliligini ta’minlash;
  • Domen qatlamini noto‘g‘ri qiymatlardan himoya qilish.

Misol:

public class CreateUserCommandValidator : AbstractValidator<CreateUserCommand>
{
    public CreateUserCommandValidator()
    {
        RuleFor(x => x.Name).NotEmpty();
        RuleFor(x => x.Age).InclusiveBetween(18, 65);
    }
}


🔹 ASP.NET Core bilan integratsiya

1. Paketni o‘rnatish:

dotnet add package FluentValidation.AspNetCore

2. Program.cs fayliga qo‘shish:

builder.Services.AddControllers();
builder.Services.AddValidatorsFromAssemblyContaining<UserDtoValidator>();
builder.Services.AddFluentValidationAutoValidation();


🔹 Test qilish (Unit Test)

[Fact]
public void Name_Should_Be_Required()
{
    var validator = new UserDtoValidator();
    var result = validator.Validate(new UserDto { Name = "" });
    Assert.False(result.IsValid);
    Assert.Contains(result.Errors, e => e.PropertyName == "Name");
}


🔹 Xulosa

FluentValidation bu oddiy tekshiruv kutubxonasi emas. U — .NET arxitekturangizda kiruvchi ma’lumotlarni semantik jihatdan toza, shartli va ifodali shaklda filtrlovchi mustahkam mexanizm. U yordamida siz:

  • Validatsiyani modullashtirasiz;
  • Kodni testlashni soddalashtirasiz;
  • Domen qatlamini ishonchli saqlaysiz;
  • Va eng muhimi — biznes qoidalarni kodga aylantirasiz.

FluentValidation bu — qoidalarning sintaktik emas, semantik vakili.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment