لتنفيذ الـ Order Module Functionality، سنقوم بإنشاء خدمة (Service) تتعامل مع عمليات إنشاء الطلبات واسترجاعها. سنبدأ بتعريف واجهة الخدمة (Service Interface) ثم نقوم بإنشاء فئة الخدمة (Service Class) التي تنفذ هذه الواجهة.
ايه هي Order Module Functionality؟
- الـ Create Order: عشان نعمل Create Order فيه بيزنس معين لازم نبقا عارفينه في دماغنا ونبدأ نرتبه كـ Steps عشان نعمل Create للـ Order Object لأنه Complex Object
- الـ Orders for specific user
- الـ Specific Order for specific user
الفرق بين الـ Service والـ Repository باختصار هو كالتالي:
-
الـRepository: ده زي المخزن أو المكتبة اللي بتتعامل مع البيانات بشكل مباشر. يعني هو اللي بيعمل العمليات الأساسية زي إضافة (Add)، حذف (Delete)، تحديث (Update)، أو استرجاع (Retrieve) البيانات من قاعدة البيانات. هو بيشتغل على مستوى الـ Table أو الـ Collection في قاعدة البيانات. يعني لو عندك طلب (Order)، الـ Repository هو اللي بيضيفه أو يشيله من قاعدة البيانات.
-
الـService: ده بقى اللي بيحتوي على منطق العمل (Business Logic). يعني هو اللي بيحدد إزاي الطلب (Order) بيتكون أو بيتعامل معاه قبل ما يتخزن في قاعدة البيانات. الـ Service ممكن يتعامل مع أكتر من Repository عشان ينفذ عملية معينة. يعني لو عايز تعمل طلب جديد، الـ Service هو اللي هيجمع البيانات المطلوبة، يتحقق منها، ويعمل أي حسابات لازمة، وبعدين يستخدم الـ Repository عشان يحفظ الطلب في قاعدة البيانات.
ببساطة، الـ Repository هو اللي بيتعامل مع البيانات بشكل مباشر، والـ Service هو اللي بيحدد إزاي البيانات دي تتكون أو تتعامل مع بعضها بناءً على منطق العمل.
1. تعريف واجهة الخدمة (Service Interface)
سنقوم بإنشاء واجهة IOrderService
في مشروع الـ Core داخل مجلد Services.Contract
. هذه الواجهة ستحدد العمليات التي يمكن تنفيذها على الطلبات:
public interface IOrderService
{
Task<Order> CreateOrderAsync(string buyerEmail, string basketId, int deliveryMethodId, Address shippingAddress);
Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail);
Task<Order> GetOrderByIdForUserAsync(int oderId, string buyerEmail);
}
هنعمله Implement في الـ Service layer وممكن يتعمله Implementation أكتر من مرة لو عندك أكتر من شكل للـ Order يعني مثلًا ممكن تحب تشتغل بطريقة ان عندك اتنين Service Layer وكل واحد فيه Order Service والـ Create Order مختلف في كل واحدة فالأولى بتاع Customer عادي والتانية بتاع Customer VIP
2. تنفيذ واجهة الخدمة (Service Implementation)
سنقوم بإنشاء فئة OrderService
في طبقة الخدمة (Service Layer) لتنفيذ واجهة IOrderService
. هذه الفئة ستحتوي على المنطق اللازم لإنشاء الطلبات واسترجاعها:
public class OrderService : IOrderService
{
private readonly IOrderRepository _orderRepository;
private readonly IBasketRepository _basketRepository;
private readonly IDeliveryMethodRepository _deliveryMethodRepository;
public OrderService(IOrderRepository orderRepository, IBasketRepository basketRepository, IDeliveryMethodRepository deliveryMethodRepository)
{
_orderRepository = orderRepository;
_basketRepository = basketRepository;
_deliveryMethodRepository = deliveryMethodRepository;
}
public async Task<Order> CreateOrderAsync(string buyerEmail, string basketId, int deliveryMethodId, Address shippingAddress)
{
// Retrieve the basket
var basket = await _basketRepository.GetBasketAsync(basketId);
if (basket == null) throw new Exception("Basket not found");
// Retrieve the delivery method
var deliveryMethod = await _deliveryMethodRepository.GetDeliveryMethodAsync(deliveryMethodId);
if (deliveryMethod == null) throw new Exception("Delivery method not found");
// Calculate the order total
var orderTotal = basket.Items.Sum(item => item.Price * item.Quantity) + deliveryMethod.Cost;
// Create the order
var order = new Order
{
BuyerEmail = buyerEmail,
ShippingAddress = shippingAddress,
DeliveryMethod = deliveryMethod,
OrderItems = basket.Items.Select(item => new OrderItem
{
ProductId = item.ProductId,
ProductName = item.ProductName,
Price = item.Price,
Quantity = item.Quantity
}).ToList(),
Total = orderTotal
};
// Save the order
await _orderRepository.AddOrderAsync(order);
return order;
}
public async Task<IReadOnlyList<Order>> GetOrdersForUserAsync(string buyerEmail)
{
return await _orderRepository.GetOrdersForUserAsync(buyerEmail);
}
public async Task<Order> GetOrderByIdForUserAsync(int orderId, string buyerEmail)
{
return await _orderRepository.GetOrderByIdForUserAsync(orderId, buyerEmail);
}
}
3. إضافة المراجع (References)
تأكد من إضافة المراجع اللازمة لمشروع الـ Core في مشروع الـ Service Layer حتى تتمكن من استخدام الواجهة والفئات المطلوبة.
4. تسجيل الخدمة في DI Container
في ملف program.cs
تأكد من تسجيل IOrderService
و OrderService
في حاوية الاعتماد (Dependency Injection Container):
public void ConfigureServices(IServiceCollection services)
{
// Other service registrations...
services.AddScoped<IOrderService, OrderService>();
}
بهذه الخطوات، تكون قد أنشأت خدمة لإدارة الطلبات في تطبيقك، مما يتيح لك إنشاء الطلبات واسترجاعها بناءً على متطلبات العمل المحددة.