المقدمة

في عالم تطوير البرمجيات، تُعتبر المعمارية أمرًا حيويًا لتصميم أنظمة مرنة وقابلة للتطوير. واحدة من المعماريات الشائعة هي Onion Architecture، التي تهدف إلى فصل المسؤوليات وتحقيق مرونة أكبر في التعديل والتطوير.

تقوم Onion Architecture على مفهوم الطبقات، حيث يتم تنظيم الكود في عدة طبقات متداخلة، مثل شكل البصلة (Onion). كل طبقة تمثل جانبًا معينًا من التطبيق، مما يسهل فهمه وتطويره.


مكونات Onion Architecture

تتكون Onion Architecture من عدة طبقات رئيسية، كل طبقة لها مسؤوليات محددة:

Onion Layer Architecture

1- الطبقة المركزية (Core Layer)

  • تحتوي على نموذج البيانات (Models) الذي يمثل الجداول في قاعدة البيانات. على سبيل المثال، إذا كنت تعمل على تطبيق لإدارة المكتبات، فقد يكون لديك نموذج يُدعى Book يحتوي على خصائص مثل Title وAuthor وISBN.
  • تشمل الواجهات (Interfaces) التي تحدد كيفية تفاعل الطبقات الأخرى مع الطبقة الأساسية. على سبيل المثال، يمكنك تعريف واجهة IBookRepository التي تحتوي على طرق مثل AddBook وGetBooks.
public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public string ISBN { get; set; }
}
public interface IBookRepository
{
    void AddBook(Book book);
    IEnumerable<Book> GetAllBooks();
}

Core Layer

2- طبقة المستودع (Repository Layer)

  • تشمل DbContext الذي يمثل الاتصال بقاعدة البيانات. على سبيل المثال، يمكن أن يكون لديك LibraryContext كـ DbContext يحدد مجموعات البيانات.
  • تحتوي على الـ Repositories، والتي تُستخدم لتنفيذ عمليات CRUD (إنشاء، قراءة، تحديث، حذف) على البيانات. هنا، يمكنك تنفيذ BookRepository لتنفيذ واجهة IBookRepository.
public class LibraryContext : DbContext
{
    public DbSet<Book> Books { get; set; }
}
public class BookRepository : IBookRepository
{
    private readonly LibraryContext _context;
    public BookRepository(LibraryContext context)
    {
        _context = context;
    }
    public void AddBook(Book book)
    {
        _context.Books.Add(book);
        _context.SaveChanges();
    }
    public IEnumerable<Book> GetAllBooks()
    {
        return _context.Books.ToList();
    }
}

Repository Layer


3- طبقة الخدمات (Services Layer)

  • تتضمن الخدمات (Services) التي تحتوي على منطق الأعمال (Business Logic) للتطبيق. على سبيل المثال، يمكنك إنشاء BookService الذي يستخدم IBookRepository لإدارة الأعمال المتعلقة بالكتب، مثل إضافة كتاب جديد.
public class BookService
{
    private readonly IBookRepository _bookRepository;


    public BookService(IBookRepository bookRepository)
    {
        _bookRepository = bookRepository;
    }


    public void CreateBook(string title, string author, string isbn)
    {
        var book = new Book { Title = title, Author = author, ISBN = isbn };
        _bookRepository.AddBook(book);
    }

    public IEnumerable<Book> GetBooks()
    {
        return _bookRepository.GetAllBooks();
    }
}

Service Layer


4- طبقة العرض (Presentation Layer)

  • تشمل واجهة المستخدم (UI)، سواء كانت عبر تطبيق ويب (MVC) أو واجهة برمجة تطبيقات (API). هنا، يمكنك إنشاء واجهة ويب تستخدم BookService لعرض وإدارة الكتب.
public class BooksController : Controller
{
    private readonly BookService _bookService;


    public BooksController(BookService bookService)
    {
        _bookService = bookService;
    }
    public IActionResult Index()
    {
        var books = _bookService.GetBooks();
        return View(books);
    }
    [HttpPost]
    public IActionResult Create(string title, string author, string isbn)
    {
        _bookService.CreateBook(title, author, isbn);
        return RedirectToAction("Index");
    }
}

Presentation Layer


مميزات Onion Architecture

  • فصل المسؤوليات: يسمح هذا التصميم بفصل منطق الأعمال عن واجهة المستخدم وقاعدة البيانات، مما يسهل فهم كل جزء على حدة.
  • سهولة الاختبار: يمكن اختبار كل طبقة بشكل منفصل، مما يسهل عملية التصحيح والتطوير.
  • المرونة: يسمح هذا التصميم بإضافة أو تعديل الميزات دون التأثير على بقية التطبيق.