Ardalis.Specification لـ C# (.NET): دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Ardalis.Specification لـ C# (.NET): دليل شامل مع أمثلة

في تطوير تطبيقات C# (.NET) الحديثة، يُعد تنظيم كود نظيف وقابل للاختبار والصيانة للتعامل مع البيانات أحد التحديات الأساسية. نمط Specification (المواصفات) هو أداة قوية تسمح بتغليف قواعد العمل ومنطق الاستعلامات في صورة فئات قابلة لإعادة الاستخدام والتركيب والاختبار. مكتبة Ardalis.Specification هي المعيار الفعلي لتطبيق هذا النمط في بيئة .NET، حيث توفر للمطورين طريقة أنيقة للتجريد من ORMs محددة (مثل Entity Framework Core و Dapper) وبناء استعلامات بيانات مرنة.

لماذا تحتاج إليها؟ في التطبيقات النموذجية التي تستخدم Entity Framework Core، غالبًا ما يكون منطق الاستعلامات مبعثرًا في جميع أنحاء الكود: في المتحكمات (Controllers)، الخدمات (Services)، والمستودعات (Repositories). يؤدي هذا إلى تكرار الكود (مثل تكرار فلتر "المستخدمون النشطون" في أماكن مختلفة)، وصعوبة في الاختبار (الحاجة إلى mocking لـ DbContext)، وهشاشة (تغيير استعلام قد يؤثر على آخر). تحل Ardalis.Specification هذه المشكلات من خلال تقديم طريقة واحدة ومكتوبة بشكل صارم لوصف البيانات المطلوب جلبها، دون الارتباط بكيفية جلبها بالضبط.

توفر المكتبة واجهة برمجة تطبيقات (API) غنية لبناء الاستعلامات: بدءًا من التصفية البسيطة (Where) إلى تضمين البيانات المرتبطة المعقدة (Include, ThenInclude)، والترتيب (OrderBy, ThenBy)، والتقسيم الصفحي (Skip, Take)، والإسقاطات (Select). وهي متوافقة تمامًا مع Entity Framework Core (عبر حزمة Ardalis.Specification.EntityFrameworkCore)، ولكن يمكن تكييفها أيضًا مع موفري بيانات آخرين. بفضل هذا، يصبح كودك أنظف، ومنطق الاستعلامات قابلاً لإعادة الاستخدام، والاختبار أسهل بكثير.

التثبيت

لتثبيت المكتبة، يتم استخدام NuGet. اعتمادًا على ORM الخاص بك، تحتاج إلى تثبيت الحزمة الأساسية وحزمة المزوّد.

# الحزمة الأساسية (تحتوي على الفئات والواجهات الأساسية)
dotnet add package Ardalis.Specification

# حزمة Entity Framework Core (تحتوي على تطبيق المستودع)
dotnet add package Ardalis.Specification.EntityFrameworkCore

# إذا كنت تستخدم الحزمة الأساسية فقط بدون EF Core (مثلاً للاختبارات أو تطبيق مخصص)
dotnet add package Ardalis.Specification

بداية سريعة

لنلقِ نظرة على مثال عملي بسيط. لنفترض أن لدينا كيان Product ونريد الحصول على جميع المنتجات التي يزيد سعرها عن 100.

// 1. تعريف الكيان
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public bool IsActive { get; set; }
}

// 2. إنشاء المواصفات (Specification)
public class ProductsWithPriceGreaterThanSpec : Specification<Product>
{
    public ProductsWithPriceGreaterThanSpec(decimal minPrice)
    {
        Query.Where(p => p.Price > minPrice);
    }
}

// 3. استخدام المواصفات مع المستودع (Repository)
public class ProductService
{
    private readonly IRepositoryBase<Product> _repository;

    public ProductService(IRepositoryBase<Product> repository)
    {
        _repository = repository;
    }

    public async Task<List<Product>> GetExpensiveProductsAsync(decimal minPrice)
    {
        var spec = new ProductsWithPriceGreaterThanSpec(minPrice);
        return await _repository.ListAsync(spec);
    }
}

في هذا المثال، أنشأنا فئة مواصفات تغلف منطق التصفية. يقوم المستودع IRepositoryBase (من حزمة Ardalis.Specification.EntityFrameworkCore) تلقائيًا بتطبيق هذه المواصفات على DbContext الخاص بك ويعيد النتيجة. هذا هو جوهر النمط: فصل وصف الاستعلام عن تنفيذه.

الطرق والفئات الأساسية

توفر المكتبة واجهة برمجة تطبيقات (API) قوية لبناء الاستعلامات. لنستعرض

توصيات