我更新了Ninject.MVC3軟件包從2.2.1.0到2.2.2.0。在通過BootStrapper.Kernel屬性訪問內核對象之前,但在新版本中,Kernel屬性被標記爲廢棄。我收到警告說Ninject.MVC3 Bootstrapper的內核屬性標記爲Obsolete。我怎樣才能訪問內核?
'公共只讀屬性內核由於Ninject.IKernel'已過時:'不要使用Ninject作爲服務定位器'。
有沒有不同的方式來訪問新版本中的內核?
我更新了Ninject.MVC3軟件包從2.2.1.0到2.2.2.0。在通過BootStrapper.Kernel屬性訪問內核對象之前,但在新版本中,Kernel屬性被標記爲廢棄。我收到警告說Ninject.MVC3 Bootstrapper的內核屬性標記爲Obsolete。我怎樣才能訪問內核?
'公共只讀屬性內核由於Ninject.IKernel'已過時:'不要使用Ninject作爲服務定位器'。
有沒有不同的方式來訪問新版本中的內核?
此標記被標記的原因已過時並將在未來更改爲內部的原因在於,如果可以的話,人們傾向於將Ninject用作服務定位器。但Service Locator is an antipattern不應使用。由於我們不想提供有助於構建設計不當的軟件的功能,它將在未來被刪除。
如果這需要對代碼進行大量更改,則表示您的代碼正在遭受這種不良依賴注入的困擾,您應該將其更改爲更好的設計。
Kernel
參數,將接收實例進行注入)。如果你真的想留在服務定位器,即使幾乎每個人都會告訴你不要,你必須自己保留一個靜態引用。
如果您有一個類(出於某種原因)需要從Ninject內核中檢索對象,則可以將該內核作爲注入的屬性/構造函數參數之一包含在該類中。從某種意義上說,這種模式更好,因爲您明確聲明特定的類正在使用內核,而不是像服務定位符模式那樣始終使用它。
這假定Ninject自動添加內核的實例綁定到自己。我知道它曾經這樣做,但如果不行,你可以手動添加綁定。
您可以使用Common Service Locator作爲Ninject的服務位置掛鉤。通用服務定位器只允許您檢索對象,而不是注入已有的對象。當然,你可以繞過這個限制,但是你可以輕鬆創建一個靜態類來公開Ninject內核和引用,而不是BootStrapper。
在ASP.NET MVC 3中,我認爲DepedencyResolver是一種獲取服務定位器的簡單方法。
從DependencyResolver獲取實例與ServiceLocator模式完全相同。它唯一應該使用的是創建控制器實例,並且只應由MVC框架調用,而不是由任何自己的代碼調用。 – 2011-07-13 15:46:04
嗯,我已經回答了這個問題,並說這是服務的位置(而不是依賴注入),我不認爲我值得downvote – Guillaume86 2011-07-19 19:22:10
所有我的MVC相關的代碼,例如控制器有構造函數注入,所以沒有問題。但是在一種情況下,我必須實現一個自定義成員資格提供者,我想將IRepository傳遞給ctor。我可以找到ony解決方案在這裏http://stackoverflow.com/questions/5596441/inject-repository-to-custom-membership-provider-with-ninject。這就是我需要訪問Kernel的原因。你知道更好的方法嗎? – mahichR 2011-05-19 12:32:32
查看我的答案;) – Guillaume86 2011-11-24 13:35:00