使 Ninject 和 WebApi v1 (MVC4) 工作时出错
Error getting Ninject and WebApi v1 (MVC4) to work
这是我收到的错误消息:
"Type 'GDMServices.Controllers.DmpeController' does not have a default constructor",
我开始沿着这条路走下去,因为答案似乎适用于几个用户,但我开始收到错误,让我觉得有些事情已经改变并放弃了那个解决方案。错误之一是无法解析 IRequest,即使我添加了对 System.Web.Http.Services 的引用(我认为这是 MVC3 依赖项)。
Ninject and ASP.NET Web API
我看到了几个使用 unity 的例子,但我真的想坚持使用 Ninject。
控制器:
public class DmpeController : ApiController
{
private readonly Logger _logger;
private readonly IDmpeService dmpeService;
public DmpeController(Logger logger, IDmpeService service)
{
this._logger = logger;
this.dmpeService = service;
}
.....
在App_Start文件夹中,NinjectWebCommons.cs从nuget安装生成:
//The class is untouched from generated form except the RegisterServices method where I added my bindings:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IAppSettings>().To<AppSettings>();
kernel.Bind<IDmpeService>().To<DmpeService>();
}
[更新] 请注意,我受困于 .Net 4.0,因此我无法升级任何软件包。
所以我又开始尝试上面提到的修复,但 IRequest 的问题仍然存在,"The type or namespace name 'IRequest' could not be found (are you missing a using directive or an assembly reference?) C:\dev\git-repo\GDM.Data\GDMServices\Services\App_Start\NinjectWebCommon.cs"。我按照规定安装了 Ninject.MVC3 没有用。
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
...
您问题的第一部分是正确的,但是您的 DmpeController
依赖于 Logger
而您没有注册该依赖性。请更新您的 RegisterServices
以注册该依赖项,它将起作用。
我想 NInject 可以处理具体类型的注册和解析。如果那不可能,提取 ILogger
接口,并使构造函数依赖于 ILogger
而不是依赖于具体类型 Logger
.
这是我收到的错误消息:
"Type 'GDMServices.Controllers.DmpeController' does not have a default constructor",
我开始沿着这条路走下去,因为答案似乎适用于几个用户,但我开始收到错误,让我觉得有些事情已经改变并放弃了那个解决方案。错误之一是无法解析 IRequest,即使我添加了对 System.Web.Http.Services 的引用(我认为这是 MVC3 依赖项)。
Ninject and ASP.NET Web API
我看到了几个使用 unity 的例子,但我真的想坚持使用 Ninject。
控制器:
public class DmpeController : ApiController
{
private readonly Logger _logger;
private readonly IDmpeService dmpeService;
public DmpeController(Logger logger, IDmpeService service)
{
this._logger = logger;
this.dmpeService = service;
}
.....
在App_Start文件夹中,NinjectWebCommons.cs从nuget安装生成:
//The class is untouched from generated form except the RegisterServices method where I added my bindings:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IAppSettings>().To<AppSettings>();
kernel.Bind<IDmpeService>().To<DmpeService>();
}
[更新] 请注意,我受困于 .Net 4.0,因此我无法升级任何软件包。
所以我又开始尝试上面提到的修复,但 IRequest 的问题仍然存在,"The type or namespace name 'IRequest' could not be found (are you missing a using directive or an assembly reference?) C:\dev\git-repo\GDM.Data\GDMServices\Services\App_Start\NinjectWebCommon.cs"。我按照规定安装了 Ninject.MVC3 没有用。
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
...
您问题的第一部分是正确的,但是您的 DmpeController
依赖于 Logger
而您没有注册该依赖性。请更新您的 RegisterServices
以注册该依赖项,它将起作用。
我想 NInject 可以处理具体类型的注册和解析。如果那不可能,提取 ILogger
接口,并使构造函数依赖于 ILogger
而不是依赖于具体类型 Logger
.