أين أضع التبعية خلق مقدم الدرجة في السلبي عرض العمارة ؟

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

سؤال

لقد ريفاكتوريد خارج نطاق جديد فئة من مقدم الدرجة ولكن أنا لا يمكن معرفة إلى أين مثيل.

هذا هو جزء من أكبر الجارية إعادة بيع ديون الجهد سيئة الحفاظ على إرث المشروع.

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

الرأي كونها أساسا شكل المتواضع يعتمد كليا على مقدم على كل شيء.

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

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

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

أنا مستعد لسماع أي اقتراحات.

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

المحلول 2

لقد وجدت الحل الأسهل.هنا مثال من بلدي الأصلي الدرجة:

public Presenter(IView view)
{
    this.View = view;
}

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

public Presenter(IView view):this(view, new Dependency()){}

public Presenter(IView view, IDependency dependency)
{
    this.View = view;
    this.Dependency = dependency;
}

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

نصائح أخرى

لدي بالفعل !!!ننظر هنا في بلدي مستودع.خياري هنا هو استخدام منشئ ...تلبية greediest أنا متأكد من أن مقدم متروك.في حال كنت يمكن أن توفر من وجهة نظر محددة impl عن التبعيات.

المتعة :)

كنت أذهب مستودع أو مصنع الآن.سيكون اختبارها على الفور.في المستقبل يمكنك استبدال تنفيذها الذهاب دي المكتبة.

public class DomainObjectsRepository
{
    /// <summary>
    /// can not be instantiated, use <see cref="Instance"/> instead.
    /// </summary>
    protected DomainObjectsRepository()
    {

    }

    static DomainObjectsRepository()
    {
        Instance = new DomainObjectsRepository();
    }

    public static DomainObjectsRepository Instance { get; set; }


    public virtual ICustomerDao GetCustomerDao()
    {
        return new CustomerDao();
    }
}

public class DomainObjectsRepositoryMock : DomainObjectsRepository
{
    public override ICustomerDao GetCustomerDao()
    {
        return new CustomerDaoMock();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top