我正在使用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
答案 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;}
}
我已经面临没有参数为此对象定义的构造函数