تكرار السؤال: …
الإجابة المختصرة
يعزل المستودع منطق استرجاع وحفظ الكيانات كمجموعة كائنات في الذاكرة، بينما تتابع وحدة العمل كل التغييرات وتضمن تنفيذها في معاملة قاعدة بيانات واحدة متكاملة (Atomic Transaction).
الشرح
بدون هذين النمطين، يمتلئ كود الأعمال باستعلامات SQL واستدعاءات db.save() متفرقة، مما يؤدي لمشاكل تجزئة المعاملات وأداء ضعيف بسبب كثرة الاتصالات بالشبكة. يقوم نمط Unit of Work بتتبع كل الكائنات التي تم إنشاؤها أو تعديلها أو حذفها أثناء سياق العمل، وعند استدعاء commit()، يقوم بفتح معاملة وحيدة وإرسال كافة التعديلات في دفعة واحدة منسقة مع إمكانية التراجع الكامل عند حدوث أي خطأ.
مثال بالكود
// استخدام النمطين معاً:
const uow = new UnitOfWork();
uow.users.add(newUser);
uow.accounts.updateBalance(accountId, 500);
await uow.commit(); // تنفيذ كل العمليات داخل معاملة واحدة متكاملةأخطاء شائعة
- استدعاء commit() بعد كل عملية فردية في المستودع، مما يدمر فكرة وحدة العمل ويضاعف زمن الاستجابة.