2009-09-17 56 views
0

我运行一个MVC 2预览,这是我第一次尝试使用Ninject2 MVCNinject MVC是否应该与MVC 2 Preview一起使用?

有错误,我continently得到的是: 试图创建类型“MyMVC.Controllers的控制器时发生错误。 EventsController”。确保控制器有一个无参数的公共构造函数。

我在我的Global.cs是这样的:

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("elmah.axd"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Root", 
      "", 
      new { controller = "Home", action = "Index", id = "" } 
     ); 
    } 

    protected override void OnApplicationStarted() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
    } 

    protected override IKernel CreateKernel() 
    { 

     return new StandardKernel(new ServiceModule()); 
    } 
} 

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IEventService>().To<EventService>(); 

     Bind<IEventRepository>().To<EventRepository>(); 

    } 
} 

而这正是我的控制器的样子。

public class EventsController : Controller 
{ 
    private IEventService _eventService; 
    // 
    // GET: /Events/ 

    public EventsController(IEventService eventService) 
    { 
     _eventService = eventService; 
    } 
    public ActionResult Index(string name) 
    { 

     return View(_eventService.GetEvent(name)); 
    } 

    public ActionResult UpcomingEvents() 
    { 
     return View(_eventService.GetUpcomingEvents().Take(3).ToList()); 
    } 

} 
+0

一切都很好编译,当我启动页面时,当我到达那里的错误。我想我错过了很简单的事情。 – OneSmartGuy 2009-09-17 20:34:59

+0

我只能说我已经在我的ASP.NET MVC 2应用程序中工作了......你的代码似乎没有任何问题。不幸的是,我的代码在家里(目前工作),所以我不能引用它。 – Charlino 2009-09-17 21:33:26

回答

1

我没有使用Ninject,但我会假设你需要实现自己的IControllerFactory。直到他们将其更新到MVC 2。然后利用了,而不是RegisterAllControllersIn(..):

ControllerBuilder.Current.SetControllerFactory(new MyNinjectControllerFactory()); 

编辑:同样,我不是所有熟悉Ninject,但是这可能工作作为简单工厂:

public class MyNinjectControllerFactory : DefaultControllerFactory 
{ 
      protected override IController GetControllerInstance(Type controllerType) 
      { 
       return [Container].GetInstance(controllerType) as Controller;    
      } 
} 
+0

从我读过的这个是在ninject后面完成的框架。不过,我对此并不熟悉,所以我会做一些更深入的研究。 – OneSmartGuy 2009-09-17 20:53:19

+0

他的应用程序继承的NinjectHttpApplication为他做了所有这些。 – Charlino 2009-09-17 21:25:20

+0

@Charlino是的,但我认为MVC框架的V2和Ninject的HttpApplication实现有问题。再一次,它只是一个假设。 – mxmissile 2009-09-17 21:46:46

0

冒着明显的风险,你应该尝试添加一个无参数的构造函数到你的事件控制器。

public class EventsController : Controller 
{ 
    private IEventService _eventService; 
    // 
    // Parameterless constructor, so NInject will work 
    public EventsController() {} 
    // 
    // Regular constructor 
    public EventsController(IEventService eventService) 
    { 
     _eventService = eventService; 
    } 
+0

这是我尝试的第一件事,但后来我的服务对象出现空错误。此外,网上找到的样本没有空的构造函数,它们运行得很好。似乎我错过了Ninject配置的一部分,但我似乎无法指出它。 http://codeclimber.net.nz/archive/2009/08/14/how-to-use-ninject-2-with-asp.net-mvc.aspx – OneSmartGuy 2009-09-17 20:50:12