Ninject入门

我在dimecasts.net上观看了Ninject的前2个初学者教程。 现在,我想在ASP.NET MVC 3中使用Ninject 2.2。我想要一个带有模拟模型的视图。 在调用我的服务时,我没有将对象引用设置为对象的实例;

public class HomeController : Controller { private readonly IMilestoneService _service; public HomeController() { } HomeController(IMilestoneService service) { _service = service; } public ActionResult Index() { ViewBag.Message = "Change Request System"; return View(); } public ActionResult About() { return View(); } #region Partial views public ActionResult Milestone() { var result = _service.GetMileStones();//OBJECT REF ERROR return View(result); } #endregion } //####GLOBAL.ASAX //By using the NinjectHttpApplication, it automatically takes care of controllers, starting up mvc, etc. //Ninject.Web.Mvc public class MvcApplication : NinjectHttpApplication { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); //StartNinject(); } #region Inversion of Control protected override IKernel CreateKernel() { return Container; } static IKernel _container; public static IKernel Container { get { if (_container == null) { _container = new StandardKernel(new SiteModule()); } return _container; } } internal class SiteModule : NinjectModule { public override void Load() { //Set up ninject bindings here. Bind().To(); } } #endregion } 

我正在使用Razor,他是里程碑式的部分视图

 @foreach (var item in Model) { 
item.Name
}

最后,主页视图索引

 @{ ViewBag.Title = "Home Page"; } 

@ViewBag.Message

@Html.Action("Milestone");

编辑 2013年11月20日

请注意,Ninject已发布2.0版本。 他们的网站上很好地概述了这些变化。 注意: StandardModule现在是NinjectModule ,命名空间Ninject.Core不再存在。 我只用Ninject替换它。

您的控制器类存在问题,具有依赖关系的构造函数是私有的 。 您的控制器应如下所示:

 public class HomeController : Controller { private readonly IMilestoneService _service; public HomeController(IMilestoneService service) { _service = service; } } 

甚至不包含公共无参数构造函数,它甚至不是有效的,您的类需要该依赖项才能运行。

实际上,我还在构造函数中对该依赖项插入了一个空检查,以确保我的类在构造时是有效的:

 public class HomeController : Controller { private readonly IMilestoneService _service; public HomeController(IMilestoneService service) { _service = service; Enforce.NotNull(() => _service); // lambda to auto-magically get variable name for exception } } 

您的MvcApplication类也可能存在问题。

而不是protected void Application_Start() ,你可以覆盖一个不同的函数, protected override void OnApplicationStarted()

这是您对安装路由的调用应该去的地方:

 public class MvcApplication : NinjectHttpApplication { public override void Init() { base.Init(); Mappers.Initialize(); } protected override Ninject.IKernel CreateKernel() { return Ioc.Initialize(); } protected override void OnApplicationStarted() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { Routing.RegisterRoutes(routes); //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); } } 

当然,如果你已经调用了Application_Start也没关系,但我没有在OP中看到它。

在global.asax文件中尝试这个:

 //By using the NinjectHttpApplication, it automatically takes care of controllers, starting up ninject, etc. //Ninject.Web.Mvc public class MvcApplication : NinjectHttpApplication { //Your other stuff here. No need to call StartNinject(). #region Inversion of Control protected override IKernel CreateKernel() { return Container; } static IKernel _container; public static IKernel Container { get { if (_container == null) { _container = new StandardKernel(new SiteModule()); } return _container; } } internal class SiteModule : NinjectModule { public override void Load() { //Set up ninject bindings here. Bind().To(); } } #endregion } 

我相信如果Ninject无法绑定该接口,则会出现绑定错误。 这让我觉得Ninject 没有实例化你的控制器。

你有Ninject.Web.Mvc吗?