2010-08-02 72 views

回答

4

相信斯科特谷的代碼應該讀...

public static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IProductRepository>().To<SqlProductRepository>(); 
    kernel.Bind<IControllerFactory>().To<NinjectControllerFactory>(); 
} 

凡NinjectControllerFactory被發現...

using Ninject.Web.Mvc; 

所以,是的,你仍然需要Ninject MVC擴展。

也許有更好/更新的方法來定義MVC 3中的默認控制器工廠,但這是我做到的。

this post所示,也可能有一些來自MvcServiceLocator的奇怪行爲。

+1

使用IMvcServiceLocator的Ninject實現,您在技術上不需要NinjectControllerFactory。 DefaultControllerFactory產生給MvcServiceLocator以創建控制器。只要Ninject有必要的綁定,就很好。 – 2010-08-02 23:03:58

+0

要添加到我的上述評論中,目前MvcServiceLocator需要IControllerFactory的綁定。如果你沒有一個(是的,即使是DefaultControllerFactory),它也會拋出這個錯誤。 – 2010-08-02 23:06:09

1

確保當你使用從您的IDependencyResolver的ninject內核,那你打電話叫

_kernel.TryGet(serviceType) 

的MVC框架將試圖抓住不同的IControllerFactory,如果它是可用的,如果你打電話「TryGet」,它將返回null,框架將使用默認的Controller Factory。

如果您使用的是unity,請確保將解決方案包裝在try/catch塊中,並在catch中返回null。雖然這樣會很慢,因爲你並不希望有一個catch塊被視爲執行流程的正常部分。