ما هو الفرق بين الأداة المساعدة Zope المحددة مع المصنع مقابل مكون؟

StackOverflow https://stackoverflow.com/questions/2135316

سؤال

من المربك قليلاً أن تسجيلات ZCML لأدوات Zope يمكن أن تقبل مكونًا أو مصنعًا.

<utility component=".some.Class" />

مقابل

<utility factory=".some.Factory" />

ماهو الفرق؟

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

المحلول

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

نصائح أخرى

أعتقد أن إجابة @Lennart-Regebro قد تكون خادعة عن غير قصد. إنه أمر مفهوم لأن مستندات Zope غامضة بعض الشيء. أعتقد أدناه التفسير الصحيح ولكن كان عليّ اختباره بنفسي للتأكد.

في كل من المكون والمصنع التسجيل كل مكالمة لاحقة إلى الإنجازات ، بعد التسجيل الأولي ، ستعيد نفس الحالة.

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

مثال المصنع

لذلك على سبيل المثال إذا كان لديك فئة فائدة محددة على النحو ؛

class MyUtility(object):
    implements(IMyUtility)
    ...

تسجيله مع ؛ <utility factory=".my_module.MyUtility"/>

سوف يتم تنفيذ ZCML عند النقطة ، قم بإنشاء مثيل من myutility وتخزينه لأي مكالمات مستقبلية للداخل ؛

> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True

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

مثال مكون

مثال مكافئ مع المكون هو ؛

class MyUtility(object):
    implements(IMyUtility)
    ...

my_module_instance_of_utility = MyUtility()

تسجيله مع ؛ <utility component=".my_module.my_module_instance_of_utility"\>

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

لا ينبغي الخلط

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

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