Skip to content

Latest commit

 

History

23 Commits

Folders and files

Repository files navigation

IranValidator

اعتبارسنج استاندارد داده‌های فارسی در .NET — نسخه 2.0.0

Build Benchmarks License NuGet version NuGet downloads Release Coverage Dependencies .NET Last commit Contributors Issues Code size Top language

فارسی | English


درباره پروژه

مجموعه‌ای سبک، فوق‌العاده سریع و بدون وابستگی خارجی برای اعتبارسنجی داده‌های هویت ایرانی در .NET — همراه با خروجی‌های ساختاریافته، پشتیبانی از چندزبانگی (Localization) و یکپارچگی کامل با ASP.NET Core و فریمورک‌های رایج.

اعتبارسنج‌ها (۱۰ مورد)

اعتبارسنج نوع ورودی الگوریتم اعتبارسنجی
کد ملی ۱۰ رقم الگوریتم Checksum وزنی
شناسه ملی شرکت ۱۱ رقم الگوریتم Checksum با وزن‌های قانونی اشخاص حقوقی
کد اقتصادی ۱۲ رقم الگوریتم Checksum با ضرایب [29,27,23,19,17,13,7,5,3,2,1]
شماره موبایل ۱۱ رقم بررسی پیش‌شماره‌های فعال 09XX (جدول ۴۲ دامنه‌ای)
کد پستی ۱۰ رقم ساختار استاندارد پست ایران
شماره کارت بانکی ۱۶ رقم الگوریتم Luhn + اعتبارسنجی پیش‌شماره BIN بانک‌ها
شماره شبا (IBAN) پیشوند IR پویش تک‌گذر MOD-97 + اعتبارسنجی کد ۳ رقمی بانک
شماره پاسپورت ۱ حرف + ۸ رقم (نسخه بیومتریک؛ فرمت ۸ رقمی قدیمی از ۱۴۰۵ منسوخ و با `PassportValidator.Instance` نامعتبر است — آرشیو با `PassportValidator.CreateArchiveValidator()`) فرمت رسمی گذرنامه (بدون Checksum)
پلاک خودرو فرمت استاندارد ساختار رسمی پلاک + کد استان
تلفن ثابت ۱۱ رقم ۰ + کد استان ۲رقمی + شماره محلی ۸رقمی (شروع ۲–۹، ۳۱ کد استان)

⚠️ توضیح مهم: این کتابخانه صرفاً ساختار، فرمت و صحت ریاضی Checksum ورودی را بررسی می‌کند و عدم مغایرت ساختاری به معنای استعلام فعال بودن یا وجود داشتن واقعی آن رکورد در سامانه‌های ثبت‌احوال، بانک‌ها یا اپراتورها نیست.

ویژگی‌های اصلی

  • ✅ طراحی مبتنی بر Span — بدون Regex؛ مسیر سریعِ بدون تخصیص (۰ بایت) روی ورودی‌های نرمال‌شدهٔ رشت‌ای
  • ✅ نرمال‌سازی خودکار — تبدیل اعداد فارسی/عربی و حذف فاصله و خط تیره (ورودی "0912-123 4567" معتبر است)
  • ✅ خروجی ساختاریافته — بازگرداندن ValidationResult شامل Success، NormalizedValue و ErrorCode
  • ✅ پشتیبانی از چندزبانگی — پیام‌های خطا به زبان‌های فارسی و انگلیسی با امکان توسعه
  • ✅ پشتیبانی از پلتفرم‌های متنوع — قابل استفاده در netstandard2.0، net8.0 و net10.0
  • ✅ بدون وابستگی خارجی — هسته اصلی پروژه وابسته به هیچ پکیج جانبی نیست
  • ✅ ایمن در محیط‌های چندنخی — ساختار Stateless و Thread-Safe
  • ✅ یکپارچگی آسان — پشتیبانی از DataAnnotations، FluentValidation، ASP.NET Core و Minimal APIs

شروع سریع

using IranValidator.Core.Extensions;

// استفاده از Extension Methodها
bool isValidNationalCode = "0010350829".IsIranNationalCode();      // true
bool isValidMobile       = "09121234567".IsIranMobile();          // true
bool isValidPostalCode   = "1145687654".IsIranPostalCode();       // true
bool isValidIban         = "IR820540102680020817909002".IsIranIban(); // true

// نرمال‌سازی خودکار ورودی
bool result = "۰۹۱۲-۱۲۳ ۴۵۶۷".IsIranMobile();                   // true
using IranValidator.Core.Validators;

var validator = NationalCodeValidator.Instance;
var result = validator.Validate("0010350829");

if (result.Success)
{
    Console.WriteLine($"✅ معتبر — مقدار نرمال‌شده: {result.NormalizedValue}");
}

یکپارچگی با فریمورک‌ها

// DataAnnotations
[NationalCode]
[IranMobile]
public string NationalCode { get; set; }

// FluentValidation
public class UserValidator : AbstractValidator<User>
{
    public UserValidator() => RuleFor(x => x.NationalCode).IranNationalCode();
}

// ASP.NET Core
builder.Services.AddIranValidation();
app.UseIranValidation();
// استفاده از [IranValidate] روی اکشن‌ها

// Minimal APIs
builder.Services.AddIranValidator();
app.MapPost("/users", (UserModel model, IranValidatorService validator) =>
    validator.ValidateNationalCode(model.NationalCode).Success ? Results.Ok() : Results.BadRequest());

راهنمای کامل: مستندات یکپارچه‌سازی

محلی‌سازی (Localization)

پیام‌های خطا بر اساس فرهنگ درخواست (Request Culture) یا UI Culture برنامه به صورت خودکار به زبان فارسی یا انگلیسی ترجمه می‌شوند.

// Registering Custom Resolvers
IranDataAnnotationsLocalization.Configure(options =>
    options.AddResolver(CultureInfo.GetCultureInfo("fa"), new MyPersianResolver()));

مستندات کامل: راهنمای محلی‌سازی

بنچمارک و کارایی

اندازه‌گیری‌شده توسط BenchmarkDotNet (MediumRun) روی محیط GitHub Actions (ubuntu-latest) و دات‌نت 10.0.12 (نسخهٔ BenchmarkDotNet: v0.14.0). مقادیر کمتر نشان‌دهنده عملکرد بهتر هستند.

زمان اجرا (نانوثانیه)

اعتبارسنجIranValidatorPersian.PlusDNTPersianUtils
کد ملی23.14156.70116.33
شناسه شرکت24.65287.29127.33
موبایل26.6795.16125.06
کد پستی11.8969.64108.90
کارت بانکی42.68458.16359.72
شبا138.85343.26207.37

تخصیص حافظه (بایت)

اعتبارسنجIranValidatorPersian.PlusDNTPersianUtils
کد ملی00169
شناسه شرکت00192
موبایل000
کد پستی0096
کارت بانکی000
شبا000

نکته‌های مهم:

  • تخصیص صفر مربوط به مسیر سریع است: ورودی‌هایی که از قبل نرمال هستند (ASCII خالص — حالت رایج) بدون کپی پردازش می‌شوند؛ ورودی‌های فارسی/عربی نیز به‌درستی نرمال‌سازی و اعتبارسنجی می‌شوند.
  • برخلاف رقبا، IranValidator به‌جای bool، نتیجهٔ ساختاریافتهٔ ValidationResult برمی‌گرداند (readonly struct — بدون هزینهٔ heap) و اعداد فارسی/عربی را نرمال‌سازی می‌کند؛ Persian.Plus نرمال‌سازی نمی‌کند و ورودی غیر-ASCII را رد می‌کند.

جزئیات کامل: راهنمای بنچمارک

پکیج‌های پروژه

پکیجوضعیتکاربرد
IranValidator.Core✅هسته اصلی اعتبارسنجی — بدون وابستگی
IranValidator.DataAnnotations✅ویژگی‌های اعتبارسنجی بر پایهٔ ویژگی‌ها
IranValidator.FluentValidation✅متدهای توسعه برای اعتبارسنجی روان
IranValidator.AspNetCore✅ثبت وابستگی، فیلتر اکشن و میدلور
IranValidator.MinimalApis✅سرویس تزریق‌پذیر برای برنامه‌های مینیمال
IranValidator.Localization✅پیام‌های خطای دوزبانه

تست و پوشش

  • تعداد تست‌ها: ۱۰۹۹ — همه سبز (xunit v3 + FluentAssertions)
  • پوشش کد: ۹۹.۷۱٪ خط / ۹۷.۸۵٪ شاخه (آستانهٔ CI: ۹۵٪)
ماژولLineBranchMethod
Core99.86%99.26%99.24%
DataAnnotations100%100%100%
FluentValidation100%96.96%100%
AspNetCore100%78.57%100%
MinimalApis100%100%100%
Localization97.40%92.85%85.71%

CI/CD

  • فایل ci.yml — بیلد + تست + گیت پوشش (آستانهٔ ۹۵٪) در هر push/PR
  • فایل benchmarks.yml — اجرای ماهانهٔ بنچمارک (میانهٔ ۳ اجرا) + مقایسه با baseline (شکست در صورت افت واقعی عملکرد) + اجرا پیش از Release
  • فایل release.yml — انتشار خودکار به NuGet.org و ساخت GitHub Release روی تگ‌های v*

لایسنس

این پروژه تحت لایسنس MIT منتشر شده است.

Releases

Packages

Contributors

Languages