سؤال

أولاً، هناك القليل من المعلومات الأساسية حول هذه المشكلة المتوفرة على مدونتي:

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

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

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

  • كائن المكون الإضافي للبيانات (تنفيذ التهيئة والتثبيت وبيانات تعريف المكون الإضافي) [الأدوات IDataPlugin<FactoryType>]
  • كائن البيانات (مثل الحساب) [الأدوات، على سبيل المثال، IAccount]
  • مصنع لإنشاء مثيلات لكائن البيانات [الأدوات، على سبيل المثال، IAccountFactory]

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

بقدر ما أستطيع أن أقول في الوقت الحالي، لدي حلان محتملان:

  1. اجعل كائن المكون الإضافي للبيانات بمثابة وسيط بين كائنات البيانات ووسيط الرسائل، ومن المحتمل أن يقوم بتجميع إشعارات التغيير.لا يعجبني هذا لأنه يضيف طبقة أخرى من التعقيد إلى نظام المراسلة الذي أشعر أنني يجب أن أكون قادرًا على الاستغناء عنه.
  2. قم بإلغاء التنفيذ الحالي المستند إلى الحدث واستخدم شيئًا آخر يمكن إدارته بسهولة أكبر (WCF في الذاكرة؟!).

لذا أعتقد أنني أسأل حقًا:

  1. كيف يمكنك حل هذه المشكلة؟
  2. ما هي الحلول المحتملة التي تعتقد أنني أغفلتها؟
  3. هل نهجي غامض على المسار الصحيح/معقول؟!:-)

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

خلفية الإطار نفسه هي كما يلي:

يتكون إطار العمل الإضافي الخاص بي من ثلاثة مكونات رئيسية:وسيط المكونات الإضافية، ومدير التفضيلات، ووسيط الرسائل.يقوم وسيط المكونات الإضافية بتنفيذ المكونات الإضافية للخبز والزبدة:اكتشاف وإنشاء المكونات الإضافية.يدير مدير التفضيلات تفضيلات المستخدم لإطار العمل والمكونات الإضافية الفردية، مثل المكونات الإضافية التي تم تمكينها، والمكان الذي يجب حفظ البيانات فيه، وما إلى ذلك.يتم الاتصال عبر النشر/الاشتراك، حيث يجلس وسيط الرسائل في المنتصف، ويجمع جميع أنواع الرسائل المنشورة ويدير الاشتراكات.يتم حاليًا تنفيذ النشر/الاشتراك عبر .NET INotifyPropertyChanged الواجهة، والتي توفر حدثًا واحدًا يسمى PropertyChanged;يقوم وسيط الرسائل بإنشاء قائمة بجميع المكونات الإضافية التي يتم تنفيذها INotifyPropertyChanged ويشترك في المكونات الإضافية الأخرى لهذا الحدث.الغرض من تمرير الرسالة هو السماح للمكونات الإضافية للحساب والمعاملة بإخطار المكونات الإضافية للتخزين بأن البيانات قد تغيرت بحيث يمكن حفظها.

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

المحلول

وهذا هو فهمي لسؤالك:لديك كائن مكون إضافي قد يتعين عليه الاستماع للأحداث الموجودة على كائنات بيانات x - بالرغم من ذلك، لا ترغب في الاشتراك في الحدث على كل كائن بيانات.أفترض أن العديد من المكونات الإضافية قد ترغب في الاستماع إلى الأحداث الموجودة على نفس كائن البيانات.

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

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

من ناحية أخرى، إذا كان مكون إضافي واحد فقط سيستمع إلى كائن بيانات في المرة الواحدة، فلماذا لا يقوم كائن البيانات باستدعاء المكون الإضافي مباشرة؟

نصائح أخرى

رائع!سؤال كبير!:)

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

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

لدى مارتن فاولر سلسلة من أنماط الأحداث في مدونته. تحقق من ذلك!قراءة جيدة جدا.

ما زال الوقت مبكرًا، ولكن هل فكرت في محاولة استخدامه؟ إم إي إف بدلا من المتداول بنفسك؟

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