没有为此对象定义的无参数构造函数...有一个扭曲?

时间:2012-09-19 18:50:34

标签: asp.net-mvc entity-framework dependency-injection ninject ninject.web.mvc

我正在使用EF5和ninject构建MVC4应用程序。当我从MVC3升级到4时,有些东西破了。所以我创建了一个全新的解决方案,得到了我所有的nuget包,添加了我的所有引用,然后复制到我的代码中。

项目建设,非常棒。

我的问题是(Ninjection)sp?似乎没有正确连线。我得到了为这个对象定义的" No Parameterless构造函数"我尝试加载页面时的运行时错误。但是,如果我只是添加一个空的公共无参数构造函数,那么页面呈现并且所有这些都与世界一致。

我的App_Start代码运行正常,NinjectWebCommon.cs(包含在问题的底部)我已经逐步完成了代码,但其他复制和粘贴,以及在线教程。我不太了解IoC,不知道下一步该做什么。

namespace search.Controllers
{
    public class HomeController : Controller
    {
        ICamaService _service = null;

        [Inject]
        public HomeController(ICamaService  service)
        {
            _service = service;
        }
        ************** ADDING THIS FIXES THE RUNTIME ERROR *********
        public HomeController(){
        ;
        }
        ***********

        //TODO: ADD ACTIONS

        public ViewResult Index()
        {
            return View();

        }
    }
}

这是我的作文根:

[assembly:     WebActivator.PreApplicationStartMethod(typeof(search4.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(search4.App_Start.NinjectWebCommon), "Stop")]

namespace search4.App_Start
{
using System;
using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using search.Services;
using search.Data;

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
    }

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ICamaContext>().To<CamaContext>().InRequestScope();
        kernel.Bind<ICamaService>().To<CamaService>().InRequestScope();

    }        

}
}

![例外的屏幕截图] [1]

http://shareimage.ro/viewer.php?file=svs5kwamqy0pxbyntig4.gif

3 个答案:

答案 0 :(得分:1)

我不是Ninject用户,但根据我在MVC中使用其他IOC框架的经验,您需要将DefaultControllerFactory替换为注入对象而不需要默认构造函数的实现。

答案 1 :(得分:0)

看起来您的绑定没有被注册。

我不确定到底出了什么问题,但我创建了一个适合我的NinjectApplicationModule:

/// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Load(new NinjectApplicationModules());
    } 


public class NinjectApplicationModules : NinjectModule
{
    /// <summary>
    /// Loads the Binding module into the kernel. Used to map Abstract Classes to Concrete classes at runtime.
    /// </summary>
    public override void Load()
    {
        // Bindings...

        Bind<ICamaContext>().To<CamaContext>().InRequestScope();
        Bind<ICamaService>().To<CamaService>().InRequestScope();

    }
}

答案 2 :(得分:0)

检查数据模型类。

Public Class A ()
{
   public A() {
     }
  public string Name{get; set;}
}

但您需要删除此默认的A类构造函数。

 Public Class A ()
{
  public string Name{get; set;}
}

我已经面临没有参数为此对象定义的构造函数