使 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.