الكشف عن التغييرات في كيانات داخل الجذر الكلي
-
07-07-2019 - |
سؤال
وإنني أتطلع إلى رؤية ما نهج الناس قد اتخذت للكشف عن تغيرات في الكيانات التي هي جزء من المجاميع.لدي شيء يعمل, ولكن أنا لست مجنون حول هذا الموضوع.أساسا ، مستودع هو المسؤول عن تحديد ما إذا كانت الدولة من الجذر الكلي قد تغير.دعونا نفترض أن لدي الجذر الكلي يسمى Book
و كيان يسمى Page
ضمن مجموع المباراتين.A Book
يحتوي على واحد أو أكثر Page
الكيانات تخزينها في Pages
جمع.
في المقام الأول, إدراج مقابلتحديث السيناريوهات يتم الانتهاء من تفتيش الجذر الكلي والكيانات التابعة لها لتحديد وجود مفتاح.إذا كان المفتاح غير موجود ، يفترض أن الكائن قد تم في وقت واحد ، حفظ مصدر البيانات الأساسي.وهذا يجعل من مرشح على التحديث ؛ ولكنها ليست نهائية على أساس أنه وحده على الكيانات.مع الجذر الكلي الجواب واضح لأن هناك واحد فقط و هو المفرد نقطة الدخول, يمكن افتراض أن مفتاح وجود تملي العملية.وهو سيناريو مقبول, في حالتي, حفظ الجذر الكلي نفسها مرة أخرى حتى أستطيع التقاط تاريخ التعديل.
للمساعدة في تسهيل هذا سلوك الكيانات نفسها ، EntityBase
فئة يحتوي على اثنين بسيطة خصائص: IsUpdated()
, IsDeleted()
.كل من هذه الافتراضي إلى false.أنا لا أريد أن أعرف إذا كانت جديدة أم لا, لأنني لا يمكن أن تحدد على أساس وجود مفتاح, كما ذكر سابقا.أساليب التنفيذ ، في هذه الحالة الصفحة, سيكون كل طريقة تغير دعم مجموعة البيانات IsUpdated()
إلى true.
لذا, فعلى سبيل المثال, الصفحة طريقة تسمى UpdateSectionName()
والذي يتغير دعم قيمة SectionName
الممتلكات التي هي للقراءة فقط.هذا النهج يستخدم باستمرار ، كما يسمح منطقي مرفق نقطة المصادقون في طريقة (منع الكيان من دخول غير صالح الدولة) أن يؤدي ذلك إعداد البيانات.والنتيجة النهائية هي أنه يجب أن أضع this.IsUpdated() = true;
في نهاية الأسلوب.
عندما الجذر الكلي يتم إرسالها إلى مستودع Save()
(منطق التحول إما إلى Insert()
أو Update()
العملية) ، ومن ثم يمكن تكرار عبر Pages
جمع في Book
, بحثا عن أي الصفحات التي لديها واحد من ثلاثة سيناريوهات:
- أي مفتاح.A
Page
مع أي مفتاح سيتم إدراج. IsDeleted = true;
حذف ينسخ التحديث و الحذف وسوف تكون ملتزمة - تجاهل أي تحديثPage
.IsUpdated = true;
التحديث سوف ترتكب على الصفحة.
القيام بهذه الطريقة يمنعني من مجرد عمياء تحديث كل ما هو في صفحات المجموعة ، والتي يمكن أن تكون شاقة إذا كان هناك عدة مئات من الصفحات الكيانات في الكتاب ، على سبيل المثال.كنت قد تم النظر في استرجاع نسخة من الكتاب بعمل مقارنة وارتكاب فقط الكشف عن التغييرات, (إدراج التحديثات و يحذف على أساس وجود و/أو المقارنة) ، ولكن يبدو أن بفظاعة الشطي طريقة للذهاب حول هذا الموضوع.
العيب الرئيسي هو أن المطور أن تذكر أن تعيين IsUpdated في كل طريقة في الكيان.تنسى واحدة, وسوف لا تكون قادرة على الكشف عن التغييرات على تلك القيمة.لقد راودت فكرة نوعا من العرف تخزين النسخ التي يمكن أن بشفافية الزمني التغييرات التي يمكن أن تجعل IsUpdated
خاصية للقراءة فقط أن مستودع يمكن استخدام تجميع التحديثات.
مستودع يستخدم وحدة العمل نمط التنفيذ أن يبني أعماله على الطابع الزمني المتولدة عند الجذر الكلي وأضيف إلى ذلك.منذ قد يكون هناك كيانات متعددة في قائمة الانتظار للعمليات الكيان عمليات طوى و تنفيذها على الفور بعد الجذر الكلي(عملية) يتم تنفيذ تلك الكيانات التي ينتمون إليها.كنت أرى اتخاذ خطوة أخرى وإنشاء وحدة أخرى من العمل فقط التعامل مع الكيان عمليات قاعدة لهم نوعا من تتبع الحدث المستخدمة في الكيان (وهو كيف أنا على افتراض أن بعض ORM المنتجات في السوق تحقيق مستوى مماثل من الوظائف).
قبل أن الحفاظ على التحرك في هذا الاتجاه ، على الرغم من أنني أحب أن أسمع أفكار/توصيات/الخبرات بشأن هذا.
تحرير: بضع قطع إضافية من المعلومات التي قد يكون من المفيد أن نعرف:
- اللغة الحالية التي أنا أعمل مع C#, على الرغم من أنني حاولت بقدر لغة المعلومات الخاصة بها ممكن, لأن هذا هو أكثر من المناقشة النظرية.
- رمز مستودعات/خدمات/الجهات/الخ.ويستند تيم مكارثي المفهوم في كتابه ".صافي المجال يحركها التصميم مع C#" ودعم رمز على CodePlex.فإنه يوفر runnable فهم نوع من النهج المتبع ، على الرغم من أن ما أنا أعمل مع إلى حد كبير إعادة كتابة من الألف إلى الياء.
المحلول
باختصار, جوابي هو أنني ذهبت مع ما اقترحت.هو العامل ، على الرغم من أنني متأكد من أن هناك مجالا للتحسين.التغييرات في الواقع استغرق وقتا قليلا جدا ، لذلك أشعر أنني لم التنقل بعيدا عن قبلة أو YAGNI مديري المدارس في هذه الحالة.:-)
ما زلت أشعر بأن هناك مجالا توقيت القضايا ذات الصلة على العمليات ، ولكن يجب أن تكون قادرة على العمل في مستودع تطبيقات.ليس الحل المثالي ، ولكن أنا لست متأكدا من أن الأمر يستحق إعادة اختراع العجلة لتصحيح المشكلة التي يمكن تجنبها في وقت أقل مما يستغرقه الإصلاح.