سؤال

وإنني أتطلع إلى رؤية ما نهج الناس قد اتخذت للكشف عن تغيرات في الكيانات التي هي جزء من المجاميع.لدي شيء يعمل, ولكن أنا لست مجنون حول هذا الموضوع.أساسا ، مستودع هو المسؤول عن تحديد ما إذا كانت الدولة من الجذر الكلي قد تغير.دعونا نفترض أن لدي الجذر الكلي يسمى Book و كيان يسمى Page ضمن مجموع المباراتين.A Book يحتوي على واحد أو أكثر Page الكيانات تخزينها في Pages جمع.

في المقام الأول, إدراج مقابلتحديث السيناريوهات يتم الانتهاء من تفتيش الجذر الكلي والكيانات التابعة لها لتحديد وجود مفتاح.إذا كان المفتاح غير موجود ، يفترض أن الكائن قد تم في وقت واحد ، حفظ مصدر البيانات الأساسي.وهذا يجعل من مرشح على التحديث ؛ ولكنها ليست نهائية على أساس أنه وحده على الكيانات.مع الجذر الكلي الجواب واضح لأن هناك واحد فقط و هو المفرد نقطة الدخول, يمكن افتراض أن مفتاح وجود تملي العملية.وهو سيناريو مقبول, في حالتي, حفظ الجذر الكلي نفسها مرة أخرى حتى أستطيع التقاط تاريخ التعديل.

للمساعدة في تسهيل هذا سلوك الكيانات نفسها ، EntityBase فئة يحتوي على اثنين بسيطة خصائص: IsUpdated(), IsDeleted().كل من هذه الافتراضي إلى false.أنا لا أريد أن أعرف إذا كانت جديدة أم لا, لأنني لا يمكن أن تحدد على أساس وجود مفتاح, كما ذكر سابقا.أساليب التنفيذ ، في هذه الحالة الصفحة, سيكون كل طريقة تغير دعم مجموعة البيانات IsUpdated() إلى true.

لذا, فعلى سبيل المثال, الصفحة طريقة تسمى UpdateSectionName() والذي يتغير دعم قيمة SectionName الممتلكات التي هي للقراءة فقط.هذا النهج يستخدم باستمرار ، كما يسمح منطقي مرفق نقطة المصادقون في طريقة (منع الكيان من دخول غير صالح الدولة) أن يؤدي ذلك إعداد البيانات.والنتيجة النهائية هي أنه يجب أن أضع this.IsUpdated() = true; في نهاية الأسلوب.

عندما الجذر الكلي يتم إرسالها إلى مستودع Save() (منطق التحول إما إلى Insert() أو Update() العملية) ، ومن ثم يمكن تكرار عبر Pages جمع في Book, بحثا عن أي الصفحات التي لديها واحد من ثلاثة سيناريوهات:

  1. أي مفتاح.A Page مع أي مفتاح سيتم إدراج.
  2. IsDeleted = true; حذف ينسخ التحديث و الحذف وسوف تكون ملتزمة - تجاهل أي تحديث Page.
  3. IsUpdated = true; التحديث سوف ترتكب على الصفحة.

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

العيب الرئيسي هو أن المطور أن تذكر أن تعيين IsUpdated في كل طريقة في الكيان.تنسى واحدة, وسوف لا تكون قادرة على الكشف عن التغييرات على تلك القيمة.لقد راودت فكرة نوعا من العرف تخزين النسخ التي يمكن أن بشفافية الزمني التغييرات التي يمكن أن تجعل IsUpdated خاصية للقراءة فقط أن مستودع يمكن استخدام تجميع التحديثات.

مستودع يستخدم وحدة العمل نمط التنفيذ أن يبني أعماله على الطابع الزمني المتولدة عند الجذر الكلي وأضيف إلى ذلك.منذ قد يكون هناك كيانات متعددة في قائمة الانتظار للعمليات الكيان عمليات طوى و تنفيذها على الفور بعد الجذر الكلي(عملية) يتم تنفيذ تلك الكيانات التي ينتمون إليها.كنت أرى اتخاذ خطوة أخرى وإنشاء وحدة أخرى من العمل فقط التعامل مع الكيان عمليات قاعدة لهم نوعا من تتبع الحدث المستخدمة في الكيان (وهو كيف أنا على افتراض أن بعض ORM المنتجات في السوق تحقيق مستوى مماثل من الوظائف).

قبل أن الحفاظ على التحرك في هذا الاتجاه ، على الرغم من أنني أحب أن أسمع أفكار/توصيات/الخبرات بشأن هذا.

تحرير: بضع قطع إضافية من المعلومات التي قد يكون من المفيد أن نعرف:

  1. اللغة الحالية التي أنا أعمل مع C#, على الرغم من أنني حاولت بقدر لغة المعلومات الخاصة بها ممكن, لأن هذا هو أكثر من المناقشة النظرية.
  2. رمز مستودعات/خدمات/الجهات/الخ.ويستند تيم مكارثي المفهوم في كتابه ".صافي المجال يحركها التصميم مع C#" ودعم رمز على CodePlex.فإنه يوفر runnable فهم نوع من النهج المتبع ، على الرغم من أن ما أنا أعمل مع إلى حد كبير إعادة كتابة من الألف إلى الياء.
هل كانت مفيدة؟

المحلول

باختصار, جوابي هو أنني ذهبت مع ما اقترحت.هو العامل ، على الرغم من أنني متأكد من أن هناك مجالا للتحسين.التغييرات في الواقع استغرق وقتا قليلا جدا ، لذلك أشعر أنني لم التنقل بعيدا عن قبلة أو YAGNI مديري المدارس في هذه الحالة.:-)

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

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