قلعة وندسور:كيفية منع المراجع الدائرية في مصنع الكائنات التي تم إنشاؤها كانت الكائنات التي تم إنشاؤها يشير إلى المصنع

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

سؤال

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

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(هذا) على كل كائن الخالق مرت في المصنع.

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

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