سؤال

لقد قمت للتو بترقية مشروع MVC2 الخاص بي إلى MVC3 واستخدمت مرجع حزمة مكتبة Nuget لتثبيت Ninject. أنشأ هذا فئة AppStart واستخدمت الكود التالي لضخ فئة emembershipservice الخاصة بي.

public static void RegisterServices(IKernel kernel) {
        kernel.Bind<IMembershipService>().To<AccountMembershipService>();
    }

هذا يعمل بشكل رائع مع HomeController ، على سبيل المثال.

public class HomeController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public HomeController() : this(null) { }

    public HomeController(IMembershipService service)
    {
        MembershipService = service;
    }

ومع ذلك ، أنا أستخدم basecontroller. تقريبا نفس الرمز في الفئة الأساسية لم يعد يعمل.

public class BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }
    public UserService UserService { get; set; }

    public BaseController() : this(null, null) { }

    public BaseController(IMembershipService service, UserService userService)
    {
        MembershipService = service;
        UserService = userService ?? new UserService();
    }

إذا اقتحمت مُنشئ وحدة التحكم الأساسية ، فإن الخدمة مجرد فارغة. لم أستخدم أبدًا Ninject for IOC ، لذا ربما تكون الإجابة واضحة ، ولكن لماذا لن يتم حقن حسابي في حساب ConsermshipController في الفصل الأساسي كما أريد؟ لا أرى ما هو مختلف ، على الرغم من أنني أدرك أن المستوى الإضافي من الميراث قد يكون العبث مع تسعة بطريقة أو بأخرى.

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

المحلول

واجهت هذه المشكلة نفسها بنفسي. على افتراض أن الكود الخاص بك يبدو هكذا:

public HomeController : BaseController
{

}

public BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public MembershipService() { }

    public MembershipService(IMembershipService service)
    {
        MembershipService = service;
    }
}

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

  1. قم بإزالة المنشئ الافتراضي. هذا هو الحل المفضل لدي لأنه يفرض حقن المنشئ (مثل عندما تقوم بإنشاء وحدة التحكم يدويًا عند اختبار الوحدة) ، ولكن الجانب السلبي هو أنه يتعين عليك تنفيذ المُنشئ في جميع الفئات الفرعية.
  2. حافظ على المُنشئ الافتراضي ، ولكن أضف ملف [Inject] تنسب إلى كل خصائص الحقن الخاصة بك:

    public BaseController : Controller
    {
        [Inject] public IMembershipService MembershipService { get;set; }
        // rest is the same
    }
    

ستؤدي Ninject إلى حقن الخصائص بشكل صحيح بهذه الطريقة ، ولكن كن على علم بأن Ninject سيتصل بالمقدمية بدون المعلمة.

نصائح أخرى

عاريات HomeController الخاصة بك من وحدة التحكم ، وليس Basecontroller؟ أيضًا ، لديك مُنشئ افتراضي لـ BaseController الذي يضع الأمور على أنها خالية. لماذا لديك ذلك على الإطلاق؟ سأبدأ بالتخلص من تلك المنشئات الافتراضية. يجب ألا تحتاج إلى أي منشئات افتراضية.

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