سؤال

أنا جديد إلى حد ما على Ninject ، لكنني تمكنت بنجاح من استخدامه في DI باستخدام مزود مخصص.

يتم تهيئة الربط على النحو التالي

kernel = new StandardKernel();

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>();

وفي الموفر المخصص ، أدعو Activator.CreateInstance مثل ذلك

protected override IPatientRecordLocator CreateInstance(IContext context)
{
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"];
    var typeName = name.Split(',')[0];
    var assemblyName = name.Split(',')[1];
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator;
}

(نعم ، أنا أدرك أنه لا يوجد معالجة خطأ ، وما إلى ذلك في الكود أعلاه :))

وكل هذا يعمل مثل السحر.

الآن ، المشكلة التي أواجهها هي عندما أقدم فصلًا جديدًا أرغب في ضخه في حالات IpatientRecordLocator. تحدث المشكلة عندما أضيف مُنشئًا مثل ما يلي إلى واحدة من هذه الفئات

[Inject]
public MockPatientRecordLocator (IContactAdapter contactAdapter)
{
    ...
}

بعد ذلك ، بالنسبة إلى Activator.CreateInstance للعمل ، علي أيضًا إضافة مُنشئ بدون معلمة إلى فئة MockpatientRecordLocator ، أي

public MockPatientRecordLocator() 
{
}

لذا ، سؤالي هو: كيف يمكنني جعل Ninjected حقن مثيل للفئة التي تنفذ icontactadapter في EG MockpatientRecordLocator؟ لقد حاولت حقن الطريقة ، ولكن دون جدوى.

لقد نسيت أن أشرح أن ما أحاول تحقيقه هو نوع من الحقن بالسلاسل حيث يتم حقن مثال من المريض من فئة المريض على سبيل المثال مع مثيل من mockpatientRecordLocator (باستخدام حقن المنشئ) ويجب أن يتم حقن مثال MockpatientRecordlocator مع مثال على icontactadapter ( مرة أخرى باستخدام حقن المنشئ (إن أمكن)). الجزء الأول من السلسلة يعمل ، والثاني لا.

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

المحلول

ليس سيئا للسؤال الأول!

تريد استخدام Bind(Type) التحميل الزائد للسماح بتسجيل الأشياء التي لا تتوفرها بشكل ثابت في سياق الخاص بك Load() رمز - قم بعمل الأشياء التي تقوم بها في مزودك (أي ، حل Type) صريح. هذا سيسمح لـ Ninjous

iirc اثنان أو 3 من إجاباتي الأخيرة قم أيضًا بالاتصال بهذا الاكتشاف/التحميل ، ولديها أمثلة يجب أن تكون ذات صلة بحالتك.

(ولن تحتاج إلى اللجوء إلى [Inject] سمات عندما تحصل على إزالة الأشياء)

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