0

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

项目建设,太棒了。

我的问题是(Ninjection)sp?似乎没有正确接线。当我尝试加载页面时,我得到“没有为此对象定义无参数构造函数”作为运行时错误。但是,如果我简单地添加一个空的公共无参数构造函数,页面就会呈现,并且一切正常。

我的 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

4

3 回答 3

1

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

于 2012-09-19T19:20:25.703 回答
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();

    }
}
于 2012-09-19T19:19:29.927 回答
0

检查你的数据模型类。

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

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

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

我已经面临为这个对象定义的无参数少构造函数

于 2014-01-07T10:25:09.507 回答