قلعة وندسور:كيفية منع المراجع الدائرية في مصنع الكائنات التي تم إنشاؤها كانت الكائنات التي تم إنشاؤها يشير إلى المصنع
-
20-08-2019 - |
سؤال
أنا باستخدام قلعة وندسور كما الحاويات اللجنة الاولمبية الدولية ، وقد المدى في مشكلة.هذا هو أفضل هو موضح في البرمجية سوء حتى محاولة إعطائها.لدي مصنع الدرجة التي ينبغي أن توفر لي مع تطبيقات واجهة معينة:
public interface IObjectCreatorFactory
{
IObjectCreator GetObjectCreator(Type objectType);
}
public interface IObjectCreator
{
T CreateObject<T>(IDataRow data);
bool SupportsType(Type type);
}
تنفيذ مصنع فئة يمكن أن تبدو مثل هذا ، على الرغم من أنني لست متأكدا من هذا هو الطريق للذهاب:واجهة عامة ObjectCreatorFactory:IObjectCreatorFactory { IEnumerable specificCreators;IObjectCreator defaultCreator;
public ObjectCreatorFactory(IEnumerable<IObjectCreator> specificCreators, IObjectCreator defaultCreator)
{
this.specificCreators= specificCreators;
this.defaultCreator= defaultCreator;
}
public IObjectCreator GetObjectCreator(Type objectType)
{
foreach (IObjectCreator creator in specificCreators)
{
if (creator.SupportsType(objectType))
{
return creator;
}
}
return defaultCreator;
}
}
الآن هذا العمل طيب ، ولكن إذا أريد IObjectCreator سبيل المثال لخلق الطفل الكائنات باستخدام محدد IObjectCreator ، أود أن أتصل ObjectCreatorFactory ، ومن الواضح أن النتائج في مرجع دائري:
public void SpecificObjectCreator:IObjectCreator
{
IObjectCreatorFactory objCreatorFactory;
public SpecificObjectCreator(IObjectCreatorFactory objCreatorFactory)
{
this.objCreatorFactory = objCreatorFactory;
}
T CreateObject<T>(IDataRow data)
{
T obj = new T;
ChildObject childObject = objCreatorFactory.GetObjectCreator(typeof(ChildObject)).CreateObject<ChildObject>(data);
.......
}
bool SupportsType(Type type);
}
هذا لا يعمل بها.ما من شأنه أن يكون وسيلة للذهاب لهذا السيناريو ، حيث خلق الكائنات تشير إلى المصنع على وجوه الأطفال المبدعين ؟
المحلول
أنا ببساطة نقل المصنع من المنشئات المختلفة كائن معين المبدعين ، وإدخال الأسلوب على IObjectCreator واجهة بدلا من ذلك ، المسؤولة عن initialising المبدعين:
public interface IObjectCreator
{
T CreateObject<T>(IDataRow data);
bool SupportsType(Type type);
void Initialize(IObjectCreatorFactory factory);
}
ثم الاحتجاج Initialze(هذا) على كل كائن الخالق مرت في المصنع.
في الماضي لقد استعملت مخصص من مراحل دورة حياتها لرعاية تلقائيا الاحتجاج "بعد البناء" إعداد مكونات كل من تجنب التعميم تبعيات و أيضا أن تأخذ الرعاية من الآخرين الشواغل المرتبطة بها (أيتطبيق إضافية تكوين مكون من مصدر خارجي مثل قاعدة بيانات) - لكن ربما مبالغة على ما تحتاجه.