سؤال

لدي مشكلة في فهم كيفية استخدام IoC في سيناريو أحتاج فيه إلى إنشاء كائنات ديناميكيًا.لنفترض أن لدي هذه الفئات:

abstract class Field {
  public Field( ICommandStack commandStack ) {}
}

abstract class Entity {
  public readonly Collection<Field> Fields { get; }
}

class EntityA {
  public EntityA( ICommandStack commandStack ) {
    Fields.Add( new StringField( commandStack ) );
  }
}

class EntitiyB {
  public EntityB( ICommandStack commandStack ) {
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
    Fields.Add( new IntField( commandStack ) );
  }
}

لذا فإن مشكلتي هي إنشاء الحقول في المنشئين.تحتاج الحقول الخاصة بي إلى ICommandStack، لكن الكيانات لا تحتاج إليه.إنهم يحصلون فقط على ICommandStack لإنشاء الحقول الخاصة بهم.

قد يكون من الأسهل طلب الحقول كوسيطة في مُنشئ كل كيان.ولكن يمكن أن يكون عدد الحقول > 10 للكيانات الفردية.لا أريد إنشاء مُنشئات تحتوي على العديد من المعلمات.

لذلك كانت فكرتي هي تسليم FieldFactory إلى الكيانات:

class EntityA {
  public EntityA( IFieldFactory fieldFactory ) {
    // create as many fields as needed via the factory
    Fields.Add( fieldFactory.CreateStringField() );
  }
}

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

ما هو حل التصميم الجيد هنا؟

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

المحلول

سأستخدم FieldFactory وأدخل المصنع بإشارة إلى الحاوية (أو إلى واجهة تلخصها إذا لم تكن راضيًا عن الاعتماد القوي على الحاوية الخاصة بك).

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

لتلخيص ذلك، سأذهب مع المصنع.

نصائح أخرى

في Spring (و Spring.NET) يوجد مفهوم حبة/كائن "ذو نطاق نموذجي".

http://static.springframework.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes-prototype

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

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