Asp.net-Web-Api

MVC5、Web API 2 和 Ninject

  • December 15, 2013

我用 Web API 2 創建了一個新的 MVC5 項目,然後我從 NuGet 添加了 Ninject.MVC3 包。

建構子注入對於 MVC5 控制器工作正常,但在嘗試將它與 Web API 控制器一起使用時出現錯誤。

嘗試創建類型為“UserProfileController”的控制器時發生錯誤。確保控制器有一個無參數的公共建構子。

工作 MVC5 控制器的建構子:

public class HomeController : Controller
{
   private IMailService _mail;
   private IRepository _repo;

   public HomeController(IMailService mail, IRepository repo)
   {
       _mail = mail;
       _repo = repo;
   }
}

非工作 Web API 控制器的建構子:

public class UserProfileController : ApiController
{
   private IRepository _repo;

   public UserProfileController(IRepository repo)
   {
       _repo = repo;
   }
}

下面是完整的 NinjectWebCommon.cs 文件:

[assembly: WebActivator.PreApplicationStartMethod(typeof(DatingSite.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(DatingSite.App_Start.NinjectWebCommon), "Stop")]

namespace DatingSite.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using DatingSite.Services;
using DatingSite.Data;

public static class NinjectWebCommon
{
   private static readonly Bootstrapper bootstrapper = new Bootstrapper();

   /// <summary>
   /// Starts the application
   /// </summary>
   public static void Start()
   {
       DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
       DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
       bootstrapper.Initialize(CreateKernel);
   }

   /// <summary>
   /// Stops the application.
   /// </summary>
   public static void Stop()
   {
       bootstrapper.ShutDown();
   }

   /// <summary>
   /// Creates the kernel that will manage your application.
   /// </summary>
   /// <returns>The created kernel.</returns>
   private static IKernel CreateKernel()
   {
       var kernel = new StandardKernel();
       kernel.Bind<Func<IKernel>().ToMethod(ctx => () => new Bootstrapper().Kernel);
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

       RegisterServices(kernel);
       return kernel;
   }

   /// <summary>
   /// Load your modules or register your services here!
   /// </summary>
   /// <param name="kernel">The kernel.</param>
   private static void RegisterServices(IKernel kernel)
   {
#if DEBUG
       kernel.Bind<IMailService>().To<MockMailService>().InRequestScope();

#else
       kernel.Bind<IMailService>().To<MailService>().InRequestScope();
#endif
       kernel.Bind<SiteContext>().To<SiteContext>().InRequestScope();
       kernel.Bind<IRepository>().To<Repository>().InRequestScope();
   }
}
}

Ninject.Web.WebApi NuGet剛剛發布。從現在開始,首選的解決方案是使用該包。我找不到任何相關文件,但安裝軟體包後一切都對我有用。

Install-Package Ninject.Web.WebApi 

安裝後,正常的 MVC 和 API 控制器實例都由 Ninject 提供。

如果您已經安裝了 Ninject.Web.Common,請確保從 NinjectWebCommon.cs 保存您的綁定,並讓 Nuget 在安裝期間重寫 NinjectWebCommon.cs,並在完成後放回您的綁定。

正如評論中指出的,根據您的執行上下文,您還需要以下軟體包之一:

  • Ninject.Web.WebApi.WebHost
  • Ninject.Web.WebApi.OwinHost
  • Ninject.Web.WebApi.Selfhost

最常見的情況是選擇 WebHost 包的 IIS。

如果您從頭開始啟動 IIS MVC5 Web 應用程序並希望使用 Ninject,請安裝以下軟體包:

  • Ninject - Ninject 核心 dll
  • Ninject.Web.Common - Ninject 的通用 Web 功能,例如。InRequestScope()
  • Ninject.MVC5 - MVC 依賴注入器,例如。為 MVC 提供控制器
  • Ninject.Web.Common.WebHost - 當 IIS 啟動 Web 應用程序時,從 Ninject.MVC5 註冊依賴注入器。如果您不使用 IIS,您將需要一個不同的包,請檢查上面
  • Ninject.Web.WebApi WebApi 依賴注入器,例如。為 WebApi 提供控制器
  • Ninject.web.WebApi.WebHost - 當 IIS 啟動 Web 應用程序時,從 Ninject.Web.WebApi 註冊依賴注入器。

引用自:https://stackoverflow.com/questions/20595472