سؤال

أقوم بتنفيذ خدمة بقية باستخدام SalviceStack. نستخدم نمط مستودع ومستودعات الأسلاك التلقائية في الخدمات عبر IOC.

حاليا، لدينا نهج ساذج حيث يتم إقران نموذج DB واحد مع مستودع واحد. هذا يعني أنه كلما يتم معالجة أكثر من كيان واحد في خدمة واحدة، لا يتم استخدام حدود معاملات. يتم استدعاء المستودعات بالتتابع: إذا فشلت خطوة واحدة أو أكثر على طول الطريق، على المرء أن "التراجع" DB إلى حالته الأولية، يدويا. أسوأ سيناريو الحالة، إذا تم وفاة مؤشر ترابط الطلب، أو في حالة حدوث استثناء غير محدد (E.G.، outofmemoryException) ستترك قاعدة البيانات في حالة غير متناسقة.

لدي مجموعة من الحلول الافتراضية، لكنني أعتبر شيئا كافية:

  1. افتح اتصال وبدء المعاملة على مستوى الخدمة. استدعاء المستودعات، تمريرهم الاتصال. من الواضح أن هذا خطأ لأنه يتعارض مع كل المبادئ التوجيهية لتصميم DDD. النقطة برمتها هي أن تكون الطبقات العليا جاهلا تماما حول الثبات ملموسة. علاوة على ذلك، فإنه سيفعل اختبار الوحدة.
  2. لديك أول مستودع تبدأ معاملة. سيتم استدعاء المستودعات المعتمدة الأخرى، ولكن اجتياز الاتصال المفتوح بالفعل. هذا يبدو أيضا مثل التصميم السيئ.
  3. تحديد المجاميع. أنا لست من محبي رائع بهذا واحد لأنني لست خبيرا نمذجة مجال، وأشعر أنه من خلال إدخال مجاميع، أنا مسؤول عن تقديم أخطاء التصاميم. ميزة واحدة من النموذج الحالي هو أنه بسيط.
  4. أي واحد لديه اقتراحات لهذه المشكلة؟ شكرا مقدما

هل كانت مفيدة؟

المحلول

يمكنك استخدام تمرير عبر الطبقة عادة ما يسمى UnitoFwork، حيث ستفتح وإغلاق "الاتصال" وإغلاقه.ابحث عن "وحدة العمل" ستجد العديد من الأمثلة.يمكنك تخصيص مقتطف أدناه لتضمين المعاملات.

giveacodicetagpre.

ثم يمكنك القيام بمعاملات متعددة مثل أدناه

giveacodicetagpre.

نصائح أخرى

من أجل استخدام المعاملات بفعالية مع Ormlite، تحتاج إلى إنشاء فئة DBManager مخصصة يمكنها الاحتفاظ بكائن الاتصال لكل مؤشر ترابط (استخدم ترسيخ).ثم يمكنك استخدام هذا DBManager مخصص في مستودعك لاستدعاء وظيفة Ormlite المختلفة.

جزء من التعليمات البرمجية الذي أستخدمه هو (تحتاج إلى تعديل التعليمات البرمجية للعمل بشكل صحيح):

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top