坚持通过史蒂文桑德森的"ASP.NET MVC 2..."工作



我收到了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 2010ProjectsCSharp2010AndDotNet4PlatformBookSportsStoreSportsStore.WebUIInfrastructureNinjectControllerFactory.cs:33
   Ninject.Modules.NinjectModule.OnLoad(IKernel kernel) in c:ProjectsNinjectninjectsrcNinjectModulesNinjectModule.cs:60
   Ninject.KernelBase.Load(IEnumerable`1 modules) in c:ProjectsNinjectninjectsrcNinjectKernelBase.cs:222
   Ninject.KernelBase..ctor(IComponentContainer components, INinjectSettings settings, INinjectModule[] modules) in c:ProjectsNinjectninjectsrcNinjectKernelBase.cs:102
   Ninject.KernelBase..ctor(INinjectModule[] modules) in c:ProjectsNinjectninjectsrcNinjectKernelBase.cs:57
   Ninject.StandardKernel..ctor(INinjectModule[] modules) in c:ProjectsNinjectninjectsrcNinjectStandardKernel.cs:31
   SportsStore.WebUI.Infrastructure.NinjectControllerFactory..ctor() in D:Visual Studio 2010ProjectsCSharp2010AndDotNet4PlatformBookSportsStoreSportsStore.WebUIInfrastructureNinjectControllerFactory.cs:18
   SportsStore.WebUI.MvcApplication.Application_Start() in D:Visual Studio 2010ProjectsCSharp2010AndDotNet4PlatformBookSportsStoreSportsStore.WebUIGlobal.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
                    );
        }
    }
}

这本书正在挑战我理解的极限,但我一直在跟着,并且已经能够调试到目前为止的所有内容。这把我难住了。知道我该从哪里开始调试吗?

这两个问题都与Ninject没有正确设置或集成有关。Ninject的主干版本允许您不必定义自定义控制器工厂。这是一个更干净的设置,不那么令人困惑。

:

  • http://codeclimber.net.nz/archive/2009/08/14/how-to-use-ninject-2-with-asp.net-mvc.aspx

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

    对象和自定义控制器工厂

是否在全局中更新了application_start。如何指向对象控制器工厂?

如下:

protected void Application_Start() {
..........
  ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory ());
}

最新更新