如何在ASP.NET MVC 2中使用Ninject 2.0?

6
我正在使用以下技术:
  1. asp.net mvc rc 2
  2. Ninject和ninject asp.net mvc扩展(http://github.com/enkari/ninject.web.mvc)
我的AccountController一直报错“此对象没有无参构造函数。” AccountController是通过服务注入的。这些服务的绑定在ServiceModule中定义。
以下是我的Global.asax.cs文件中MvcApplication的代码。
public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

    }

    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new INinjectModule[] { 
            new ServiceModule(),
        });
    }
}

其他控制器是否正常工作?您是否使用ASP.NET MVC 2 RC 2构建了Ninject.Web.Mvc项目? - Charlino
4个回答

7
重新针对ASP.Net MVC 2 dlls构建Ninject.Web.Mvc解决了该问题。问题出在NinjectControllerFactory类上,MVC 2中获取控制器实例的方法签名已经发生了变化。
IController GetControllerInstance(Type controllerType)

To

IController GetControllerInstance(
        RequestContext requestContext, Type controllerType)

进行必要的更改并重新构建Ninject MVC扩展,一切都可以正常工作。感谢@Charlino的建议。


1
好听到这个消息。感到很失落,没有回答并获得积分!;-) - Charlino

1
无论出于何种原因,我发现如果你的global.asax.cs继承自NinjectHttpApplication,则OnApplicationStarted()不会被调用。将你的OnApplicationStarted()更改为覆盖Init(),它应该可以工作。
请参见下文:
public class MvcApplication : NinjectHttpApplication // System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

    }

    public override void Init()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    }

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new INinjectModule[] { 
            new ServiceModule(),
        });
    }
}

-1
在Ninject中,您不应该覆盖Application_Start方法。如果您需要完成一些自动化无法完成的任务(例如注册区域 - 我不确定Ninject是否也会为您完成此操作),请确保调用base.OnApplicationStarted()以使所有特定于Ninject的内容正常运行。
protected override void OnApplicationStarted()
{
    base.OnApplicationStarted();

    // Kick some butt here
}

从我在“NinjectHttpApplication.cs”文件中看到的内容,该函数是空的。我同意按照您所说的方式进行操作(因为它是虚拟的),但这并不能解决我的问题。 - Jitesh Patil

-1

代码看起来正确,除了在 'new ServiceModule()' 后面的逗号。

它应该在 Global.asax.cs 中,而不是 Global.aspx.cs。


已编辑问题中的文件名。那是一个打字错误。逗号并不重要,这只是打字语法。 - Jitesh Patil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接