2016-01-08 81 views
0

標誌着其視爲重複之前,請先通過這個問題來閱讀的時候了!無參數的構造函數與Ninject,既MVC和網絡API

我在VS2015中創建一個新的Web應用程序項目,加入MVC 5和網絡API 2.

我已經添加了下面的包到工程:

Ninject 
Ninject.MVC5 
Ninject.Web 
Ninject.Web.Common 
Ninject.Web.Common.WebHost 
Ninject.Web.WebApi 
Ninject.Web.WebApi.WebHost 

並創建一個NinjectWeb.cs和App_Start文件夾中的NinjectWebCommon.cs文件。兩個都有斷點,我知道他們在創業時受到打擊。

但我仍然得到這個對象定義的

無參數的構造函數

錯誤創下了MVC控制器和

確保控制器具有一個無參數時公共構造函數。創下了網絡API控制器時,

錯誤。

所以我有一個工作圍繞「解決」這個問題,我已經添加了這些2號線到NinjectWebCommon.cs文件的CreateKernel方法:

GlobalConfiguration.Configuration.DependencyResolver = new Ninject.Web.WebApi.NinjectDependencyResolver(kernel); 
System.Web.Mvc.DependencyResolver.SetResolver(new Ninject.Web.Mvc.NinjectDependencyResolver(kernel)); 

所以問題:凡在Ninject代碼應該如何處理?我想抓住GitHub的代碼來解決這個問題,但想知道我應該在哪裏看?

編輯:RegisterServices方法的內容:

private static void RegisterServices(IKernel kernel) { 

      // Identity 
      kernel.Bind<IUserStore<ApplicationUser>>() 
       .To<UserStore<ApplicationUser>>() 
       .WithConstructorArgument("connectionNameOrUrl", "User.MongoDB"); 
      kernel.Bind<UserManager<ApplicationUser>>() 
       .ToSelf() 
       .InRequestScope() 
       .WithConstructorArgument("store", ctx => ctx.Kernel.Get<IUserStore<ApplicationUser>>()); 

      // Services 

      // Other 
      kernel 
       .Bind<IAzureSettings>() 
       .To<UserAzureSettings>() 
       .InRequestScope(); 

      // Providers 
      kernel 
       .Bind<WebApiUserProvider>() 
       .ToSelf(); 
      kernel 
       .Bind<MVCUserProvider>() 
       .ToSelf(); 
      kernel 
       .Bind<IUserProvider>() 
       .ToMethod((ctx) => { 
        if (HttpContext.Current.Handler.GetType().Namespace.StartsWith("System.Web.Mvc")) { 
         return ctx.Kernel.Get<MVCUserProvider>(new Ninject.Parameters.IParameter[] { }); 
        } 
        else { 
         return ctx.Kernel.Get<WebApiUserProvider>(new Ninject.Parameters.IParameter[] { }); 
        } 
       }) 
       .InRequestScope(); 
     } 
+1

但是爲什麼要將依賴解析器連接成Ninject代碼的一部分呢? –

+0

如果不是,它應該是NinjectWebCommon類中代碼的一部分,但事實並非如此。如果你瀏覽一些關於SO的問題,它應該是顯而易見的。 –

+0

本身顯示錯誤,您的控制器未註冊。 –

回答

0

我只是做了一些實驗與Ninject和MVC。我碰巧在你的問題中提到了你在我的直播網站上提到的兩行,但我沒有機會真正思考爲什麼直到現在需要它們,除此之外我需要它注入WebAPI。

我創建了一個全新的ASP.NET MVC項目在Visual Studio中,安裝了NuGet包Ninject.MVC5。我添加了一個簡單的界面,具體的實現並添加了一個綁定到NinjectWebCommon類的RegisterServices()方法。

添加綁定到一個MVC控制器後,它只是工作,該接口是在我的構造函數的具體類解決。看起來,Ninject的MVC版本可以直接「開箱即用」,可以這麼說,而不必明確指定依賴注入器。

我看着Github for Ninject.Web.WebApi並沒有在主頁上的樣本項目,您可以下載具有注入的三個樣本應用到的WebAPI。在溶液中的樣品的WebAPI例子(不是OwinHosted或SelfHosted項目)也沒有DependencyResolver的任務......我跑它恢復就可以了的NuGet包後,它的工作原理。

我意識到這並不完全回答這個問題,但我認爲仔細看一下示例WebApi項目可能會揭示答案。要麼是這個問題,要麼是因爲ASP.NET MVC和WebAPI存在於同一個項目中,而我們想要注入到兩者中?