Asp.net mvc 2 一直在通过史蒂文·桑德森';s";ASP.NET MVC 2…”;

Asp.net mvc 2 一直在通过史蒂文·桑德森';s";ASP.NET MVC 2…”;,asp.net-mvc-2,ninject,Asp.net Mvc 2,Ninject,我在学校里收到了关于ASP.NET MVC的简要介绍,我正试图用Steven Sanderson的书Pro ASP.NET MVC 2框架来扩展这一知识库。这是一个很大的帮助,但我在实现Ninject的示例中遇到了一个难题。我相信DI的设置是正确的,但当我试图在我的Ninject控制器类中为依赖项指定绑定时,我会收到两个棕色死亡屏幕中的一个: 没有为此对象定义无参数构造函数。 堆栈跟踪: [MissingMethodException: No parameterless constructor

我在学校里收到了关于ASP.NET MVC的简要介绍,我正试图用Steven Sanderson的书Pro ASP.NET MVC 2框架来扩展这一知识库。这是一个很大的帮助,但我在实现Ninject的示例中遇到了一个难题。我相信DI的设置是正确的,但当我试图在我的Ninject控制器类中为依赖项指定绑定时,我会收到两个棕色死亡屏幕中的一个:

没有为此对象定义无参数构造函数。

堆栈跟踪:

[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Activator.CreateInstance(Type type) +6
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +491

[InvalidOperationException: An error occurred when trying to create a controller of type 'SportsStore.WebUI.Controllers.ProductsController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +628
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +204
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +193
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +160
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +80
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +45
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8898152
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
[NullReferenceException: Object reference not set to an instance of an object.]
   SportsStore.WebUI.Infrastructure.SportsStoreServices.Load() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Infrastructure\NinjectControllerFactory.cs:33
   Ninject.Modules.NinjectModule.OnLoad(IKernel kernel) in c:\Projects\Ninject\ninject\src\Ninject\Modules\NinjectModule.cs:60
   Ninject.KernelBase.Load(IEnumerable`1 modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:222
   Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:102
   Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:57
   Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:31
   SportsStore.WebUI.Infrastructure.NinjectControllerFactory..ctor() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Infrastructure\NinjectControllerFactory.cs:18
   SportsStore.WebUI.MvcApplication.Application_Start() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Global.asax.cs:32
对象引用未设置为对象的实例。

堆栈跟踪:

[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Activator.CreateInstance(Type type) +6
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +491

[InvalidOperationException: An error occurred when trying to create a controller of type 'SportsStore.WebUI.Controllers.ProductsController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +628
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +204
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +193
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +160
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +80
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +45
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8898152
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
[NullReferenceException: Object reference not set to an instance of an object.]
   SportsStore.WebUI.Infrastructure.SportsStoreServices.Load() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Infrastructure\NinjectControllerFactory.cs:33
   Ninject.Modules.NinjectModule.OnLoad(IKernel kernel) in c:\Projects\Ninject\ninject\src\Ninject\Modules\NinjectModule.cs:60
   Ninject.KernelBase.Load(IEnumerable`1 modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:222
   Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:102
   Ninject.KernelBase..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:57
   Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:\Projects\Ninject\ninject\src\Ninject\StandardKernel.cs:31
   SportsStore.WebUI.Infrastructure.NinjectControllerFactory..ctor() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Infrastructure\NinjectControllerFactory.cs:18
   SportsStore.WebUI.MvcApplication.Application_Start() in D:\Visual Studio 2010\Projects\CSharp2010AndDotNet4PlatformBook\SportsStore\SportsStore.WebUI\Global.asax.cs:32
以下是我在Ninject控制器类中的代码:

public class NinjectControllerFactory : DefaultControllerFactory
{
    // A Ninject "kernel" is the things that can supply object instances
    private IKernel kernel = new StandardKernel(new SportsStoreServices());

    // ASP.NET MVC calls this to get the controller for each request
    protected override IController GetControllerInstance(RequestContext context, Type controllerType)
    {
        if (controllerType == null)
            return null;
        return (IController)kernel.Get(controllerType);
    }

    // Configures how abstract service types are mapped to concrete implementations
    private class SportsStoreServices : NinjectModule
    {
        public override void Load()
        {
            Bind<IProductsRepository>()
                .To<SqlProductsRepository>()
                .WithConstructorArgument("connectionString",
                    ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString
                    );
        }
    }
}
公共类NinjectControllerFactory:DefaultControllerFactory
{
//Ninject“内核”是可以提供对象实例的东西
私有IKernel内核=新的标准内核(新的SportsStoreServices());
//ASP.NET MVC调用此函数以获取每个请求的控制器
受保护的重写IController GetControllerInstance(RequestContext上下文,类型controllerType)
{
如果(controllerType==null)
返回null;
return(IController)kernel.Get(controllerType);
}
//配置抽象服务类型映射到具体实现的方式
私有类SportsStoreServices:Ninject模块
{
公共覆盖无效负载()
{
绑定()
.至()
.WithConstructorArgument(“connectionString”,
ConfigurationManager.ConnectionString[“AppDb”]。ConnectionString
);
}
}
}

这本书超越了我的理解极限,但我一直在跟进,直到目前为止,我已经能够调试一切。这把我难住了。你知道我从哪里开始调试这个吗

这两个问题都与Ninject未正确设置或集成有关。Ninject的主干版本允许您不必定义自定义控制器工厂。这是一个更干净的设置和更少的混乱

见:

此外,你应该看看这里列出的文章


您是否在global.asax中更新了应用程序\u start以指向ninject控制器工厂

因此:

protected void Application_Start() {
..........

  ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory ());
}

谢谢你的出发点。知道该追求什么很好。我会投票支持你的答案,但显然我没有必要的声誉@Midloo您的问题之一可能是由于当前版本的Ninject要求每个控制器都有一个默认构造函数,并且没有定义参数“public MyController(){}”。但是我不记得这是必要的,你应该发现如果你使用一个更新版本的Ninject,你会让它工作得更快。谢谢你的进一步提示。我正在使用.NET4.0的最新版本v2.2.0.0。这本书是从v.2.0开始的,目标是.NET3.5。也可能是我的问题的一部分。再次感谢您的指导。Ninject不需要无参数构造函数。但正如贾斯汀所说。当有一个有效的实现时,为什么要使用自己的实现?stacktraces显示控制器出厂时未正确更换。连接字符串配置返回null的第二个字符串。@Remo感谢您的评论。这本书建议您创建自己的实现,以便了解如何使用除Ninject之外的DI容器。在当时似乎是很好的逻辑,但Ninject MVC扩展确实让这变得更容易。我确实需要更多的工作来理解堆栈跟踪。谢谢你提供的信息。这种情况每次都会发生吗?