ميكروسيرفيسات بلغة C#: الهندسة والممارسة من الألف إلى الياء

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

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

ابدأ الدورة

مقدمة في الميكروسيرفيسات بلغة C#

\n

أصبحت بنية الميكروسيرفيسات المعيار الفعلي لبناء التطبيقات المعقدة والقابلة للتوسع والمتسامحة مع الأخطاء. على عكس التطبيق المتجانس (Monolith)، حيث يتم دمج كل الكود في عملية واحدة، تقوم الميكروسيرفيسات بتقسيم النظام إلى خدمات صغيرة يتم نشرها بشكل مستقل. توفر منصة .NET (C#) جميع الأدوات اللازمة لإنشاء ميكروسيرفيسات احترافية: من ASP.NET Core لواجهات برمجة التطبيقات (API) إلى المكتبات للعمل مع قوائم الانتظار، والحاويات، والتنسيق.

\n

في هذه المقالة، سنستعرض المسار الكامل من تصميم الهندسة إلى التنفيذ العملي لميكروسيرفيس بلغة C# مع أمثلة على الكود.

\n\n

1. أساسيات هندسة الميكروسيرفيسات

\n

المبادئ والأنماط المضادة

\n

قبل كتابة الكود، من المهم فهم المبادئ الأساسية:

\n
    \n
  • المسؤولية الواحدة (SRP): كل خدمة مسؤولة عن وظيفة تجارية واحدة (مثل خدمة الطلبات، خدمة الدفع).
  • \n
  • الترابط الضعيف: تتواصل الخدمات عبر الشبكة (HTTP, gRPC, قوائم الانتظار) ولا تعرف شيئًا عن البنية الداخلية لبعضها البعض.
  • \n
  • النشر المستقل: يمكنك تحديث خدمة واحدة دون إيقاف الخدمات الأخرى.
  • \n
  • لامركزية البيانات: كل خدمة تمتلك قاعدة بيانات خاصة بها (Database per Service).
  • \n
\n

الأنماط المضادة التي يجب تجنبها: الخدمات الصغيرة جدًا (nanoservices)، قاعدة البيانات المشتركة، سلاسل الاستدعاءات المتزامنة (chattiness).

\n\n

التواصل بين الخدمات

\n

للتفاعل بين الميكروسيرفيسات بلغة C#، يتم استخدام:

\n
    \n
  • التزامني: REST API (HTTP/JSON) أو gRPC (بروتوكول ثنائي، أسرع).
  • \n
  • غير التزامني: قوائم انتظار الرسائل (RabbitMQ, Azure Service Bus, Kafka) - الطريقة المفضلة لتحقيق الترابط الضعيف.
  • \n
\n\n

2. التنفيذ العملي لميكروسيرفيس بلغة C#

\n

مثال: خدمة إدارة الطلبات

\n

سنقوم بإنشاء ميكروسيرفيس بسيط باستخدام ASP.NET Core 8. سنستخدم Clean Architecture لفصل الطبقات.

\n\n

الخطوة 1: المشروع والهيكل

\n
dotnet new webapi -n OrderService\ncd OrderService
\n

نقوم بإنشاء المجلدات: Controllers، Models، Services، Data.

\n\n

الخطوة 2: نموذج البيانات

\n
// Models/Order.cs\npublic class Order\n{\n    public int Id { get; set; }\n    public string CustomerName { get; set; }\n    public decimal TotalAmount { get; set; }\n    public DateTime CreatedAt { get; set; }\n}
\n\n

الخطوة 3: سياق قاعدة البيانات (Entity Framework Core)

\n
// Data/OrderDbContext.cs\npublic class OrderDbContext : DbContext\n{\n    public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options) { }\n    public DbSet<Order> Orders { get; set; }\n}
\n\n

الخطوة 4: طبقة الخدمة

\n
// Services/IOrderService.cs\npublic interface IOrderService\n{\n    Task<Order> CreateOrderAsync(Order order);\n    Task<List<Order>> GetAllOrdersAsync();\n}\n\n// Services/OrderService.cs\npublic class OrderService : IOrderService\n{\n    private readonly OrderDbContext _context;\n    public OrderService(OrderDbContext context)\n    {\n        _context = context;\n    }\n\n    public async Task<Order> CreateOrderAsync(Order order)\n    {\n        _context.Orders.Add(order);\n        await _context.SaveChangesAsync();\n        return order;\n    }\n\n    public async Task<List<Order>> GetAllOrdersAsync()\n    {\n        return await _context.Orders.ToListAsync();\n    }\n}
\n\n

الخطوة 5: المتحكم (Controller)

\n
// Controllers/OrdersController.cs\n[ApiController]\n[Route("api/[controller]")]\npublic class OrdersController : ControllerBase\n{\n    private readonly IOrderService _orderService;\n    public OrdersController(IOrderService orderService)\n    {\n        _orderService = orderService;\n    }\n\                

المدونات

توصيات الكتب