asp.net-mvc-2 - Ninject 2 和 MVC 2.0

标签 asp.net-mvc-2 ninject

我已经将一个项目从 VS2008 和 MVC1 更新到了 VS2010 和 MVC2。我遇到了 Ninject 在区域内找不到 Controller 的问题

这是我的 global.asax.cs 文件:

namespace Website
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode, 
// visit http://go.microsoft.com/?LinkId=9394801

public class MvcApplication : NinjectHttpApplication
{
    public static StandardKernel NinjectKernel;

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Balance",
            "Balance/{action}/{month}/{year}",
            new { controller = "Balance", action = "Index", month = DateTime.Now.Month, year = DateTime.Now.Year }
        );

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

    }

    /*
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);

        // initializes the NHProfiler so you can see what is going on with your queries
        HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
    }
    */

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

    protected void Application_Error(object sender, EventArgs e)
    {
        var errorService = NinjectKernel.Get<IErrorLogService>();
        errorService.LogError(HttpContext.Current.Server.GetLastError().GetBaseException(), "AppSite");
    }

    protected override IKernel CreateKernel()
    {
        if (NinjectKernel == null)
        {
            NinjectKernel = new StandardKernel(new ServiceModule());
        }

        return NinjectKernel;
    }
}

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IHelper>().To<Helper>().InRequestScope();
        Bind<IErrorLogService>().To<ErrorLogService>();

        Bind<INHSessionFactory>().To<NHSessionFactory>().InSingletonScope();
        Bind<ISessionFactory>().ToMethod(ctx =>
                                         ctx.Kernel.Get<INHSessionFactory>().GetSessionFactory())
                               .InSingletonScope();

        Bind<INHSession>().To<NHSession>();
        Bind<ISession>().ToMethod(ctx => ctx.Kernel.Get<INHSession>().GetSession());
    }
}
}

访问/Controllers 文件夹中的 Controller 工作正常,但访问/Areas/Member/Controller 中的 Controller 会引发以下错误:
Server Error in '/' Application.

Cannot be null
Parameter name: service

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentNullException: Cannot be null
Parameter name: service

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 
[ArgumentNullException: Cannot be null
Parameter name: service]
Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) +193
Ninject.Web.Mvc.NinjectControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +41
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +66
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +124
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +48
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8771488
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

Version Information: Microsoft .NET Framework Version:4.0.30128; ASP.NET     Version:4.0.30128.1

此请求的 Url 是/Member/Controller/,如果我也更改 Url/Controller Controller 会触发,但我收到错误消息,系统在路径/Views 中找不到 View

什么时候应该在/Area/Members/Views 中查找

我要么在升级中做错了什么,要么我错过了一些东西,但我无法弄清楚是什么。我一直在努力解决这个问题 3 天...

最佳答案

从核心更新,我刚刚提交了一个修复:http://github.com/ninject/ninject.web.mvc

-伊恩

关于asp.net-mvc-2 - Ninject 2 和 MVC 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473802/

相关文章:

c# - 如果参数为 null,则阻止 MVC Action 方法执行

c# - asp.net mvc中的文件 uploader

c# - 在 NInject 中实现 OnePerSessionBehavior

c# - 如何跨程序集使用 Ninject

asp.net-mvc-4 - 在 MVC4 中对 api 和 "regular" Controller 使用 Ninject DI

c# - 使用 Ninject 和 Ninject.Extensions.Nlog2 的空引用异常

c# - 如何在 Application_EndRequest 中获取 RouteData

asp.net-mvc-2 - ASP.NET MVC 2+ 和 PRG 模式

c# - 在 ASP.NET MVC4 中注入(inject)

c# - 学习 ASP.NET MVC 2 之前有必要了解 ASP.NET 吗?