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吗?