2009-09-17 26 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

相關問題