Asp.net-Web-Api
MVC5、Web API 2 和 Ninject
我用 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 註冊依賴注入器。