Entity Framework - تنظيم الكود بطريقة نظيفة (Repository Pattern + Unit of Work)

Entity Framework Core - تنظيم الكود بطريقة نظيفة (Repository Pattern + Unit of Work)

عند بناء تطبيقات متوسطة أو كبيرة باستخدام EF Core، من الأفضل فصل منطق الوصول إلى البيانات (Data Access Logic) عن بقية الكود باستخدام أنماط معمارية نظيفة مثل Repository Pattern وUnit of Work Pattern.

---

🔹 ما هو Repository Pattern؟

هو طبقة وسيطة بين DbContext وبين الكود الخاص بك. تتعامل مع الكيانات بطريقة مجردة دون الحاجة لكتابة استعلامات مباشرة في كل مرة.

---

🔹 ما هو Unit of Work Pattern؟

هو نمط يسمح بجمع كل العمليات التي تتم خلال نفس الجلسة (DbContext) وتنفيذها كعملية واحدة (معاملة واحدة).

---

🔹 مثال عملي - إنشاء Repository عام (Generic Repository):


// IGenericRepository.cs

public interface IGenericRepository<T> where T : class
{
    Task<IEnumerable<T>> GetAllAsync();
    Task<T> GetByIdAsync(int id);
    Task AddAsync(T entity);
    void Update(T entity);
    void Delete(T entity);
}

// GenericRepository.cs

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    private readonly ApplicationDbContext _context;
    private readonly DbSet<T> _dbSet;

    public GenericRepository(ApplicationDbContext context)
    {
        _context = context;
        _dbSet = context.Set<T>();
    }

    public async Task<IEnumerable<T>> GetAllAsync()
    {
        return await _dbSet.ToListAsync();
    }

    public async Task<T> GetByIdAsync(int id)
    {
        return await _dbSet.FindAsync(id);
    }

    public async Task AddAsync(T entity)
    {
        await _dbSet.AddAsync(entity);
    }

    public void Update(T entity)
    {
        _dbSet.Update(entity);
    }

    public void Delete(T entity)
    {
        _dbSet.Remove(entity);
    }
}
---

🔹 إنشاء وحدة عمل (Unit of Work):


// IUnitOfWork.cs

public interface IUnitOfWork : IDisposable
{
    IGenericRepository<Student> Students { get; }
    IGenericRepository<Department> Departments { get; }
    Task SaveAsync();
}

// UnitOfWork.cs

public class UnitOfWork : IUnitOfWork
{
    private readonly ApplicationDbContext _context;

    public IGenericRepository<Student> Students { get; private set; }
    public IGenericRepository<Department> Departments { get; private set; }

    public UnitOfWork(ApplicationDbContext context)
    {
        _context = context;
        Students = new GenericRepository<Student>(context);
        Departments = new GenericRepository<Department>(context);
    }

    public async Task SaveAsync()
    {
        await _context.SaveChangesAsync();
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}
---

🔹 فوائد استخدام Repository + Unit of Work:

  • ✅ فصل منطق الوصول إلى البيانات عن منطق الأعمال (Business Logic).
  • ✅ تسهيل كتابة اختبارات (Unit Testing) للتطبيق.
  • ✅ تحسين صيانة الكود وتسهيل التوسع المستقبلي.
---

✅ استخدام Repository وUnit of Work مع EF Core يجعل هيكلية تطبيقك أكثر نظافة وتنظيمًا ويقلل من التكرار ويزيد من الاحترافية في إدارة العمليات على قاعدة البيانات.

تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

1.1 SQL Introduction

Entity Framework - مقدمة عن Entity Framework