【问题标题】:Is Ninject MVC supposed to work with MVC 2 Preview?Ninject MVC 是否应该与 MVC 2 Preview 一起使用?
【发布时间】:2009-09-17 20:33:32
【问题描述】:

我正在运行 MVC 2 预览版,这是我第一次尝试使用 Ninject2 MVC

我大陆得到的错误是: 尝试创建类型为“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());
    }

}

【问题讨论】:

  • 一切编译正常,当我启动页面时出现错误。我想我错过了一些非常简单的东西。
  • 我只能说,我已经让它在我的 ASP.NET MVC 2 应用程序中工作了......你的代码似乎也没有任何问题。不幸的是,我的代码在家里(目前正在工作),所以我无法引用它。

标签: asp.net-mvc ioc-container ninject


【解决方案1】:

我没有使用过 Ninject,但我认为您需要实现自己的 IControllerFactory。直到他们将其更新到 MVC 2。然后使用它而不是 RegisterAllControllersIn(..):

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

编辑:同样,我对 Ninject 不是很熟悉,但这可能作为一个 simple 工厂工作:

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

【讨论】:

  • 据我所知,这是在 ninject 框架后面完成的。但是我也不太熟悉这个,所以我会做更多的挖掘。
  • 他的应用程序继承的 NinjectHttpApplication 为他完成了所有这些工作。
  • @Charlino 是的,但我认为 MVC 框架的 V2 和 Ninject 的 HttpApplication 实现有问题。同样,这只是一个假设。
  • 我开始认为是这种情况。我到处看了看,我似乎没有遗漏任何东西。我将推出自己的 ControllerFactory 并更新我的结果。
【解决方案2】:

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

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

【讨论】:

  • 这是我尝试的第一件事,但随后我的服务对象出现空错误。此外,在线找到的示例没有空的构造函数,它们运行得很好。似乎我错过了作为 Ninject 配置一部分的东西,但我似乎无法指出它。 codeclimber.net.nz/archive/2009/08/14/…
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多