您好我正在使用MVC4和WebAPI2,我在 Ninject 中遇到了does not have a default constructor
错误(这是ninject上的一个已知错误)我使用 NinjectDependencyResolver 自定义类以及 WebApiContrib.Ioc.Ninject nuget以找出此错误。这是我的 NinjectWebCommon 。
我不确定是因为我的项目是分层的,所以层就像 我有“CompositionRoot”图层,其中添加了Ninject,我将此图层引用到我的主要Web图层。我的项目正在运行,但我的网页api没有返回json,请帮助我,我不能在没有得到这个修复的情况下前进,提前感谢。
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();
}
public static IKernel CreateKernel() {
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
GlobalConfiguration.Configuration.DependencyResolver =
new NinjectResolver(kernel);
// I tested using below code as well (NinjectDependencyResolver
// is custom class to fix this issue )
//GlobalConfiguration.Configuration.DependencyResolver =
// new NinjectDependencyResolver(kernel);
return kernel;
}
private static void RegisterServices(IKernel kernel) {
kernel.Bind<IUserBusiness>().To<UserBusiness>().InRequestScope();
kernel.Bind<IUserDataAccess>().To<UserDataAccess>().InRequestScope();
}
}
答案 0 :(得分:2)
德拉克斯,
在此时创建内核时,您不应将DependencyResolver
分配给GlobalConfiguration。原因是Start()
方法通常在WebActivator
上运行,即使在ASP.NET WebAPI子系统或应用程序启动之前也会启动。
我的建议是将此依赖项解析程序的分配移至Global.asax
内的WebApiConfig.cs
或App_Start
:
public static void Register(HttpConfiguration config)
{
[...]
//Dependency Resolver configuration
config.DependencyResolver = new NinjectResolver((new Boostrapper).Kernel);
// Configure routes and the rest of WebAPI stuff.
}
并且不要忘记Global.asax
(它应该已经存在):
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
看看这是否适合你,让我们知道。如果没有,请使用您的NinjectResolver
代码更新问题。