【问题标题】:Error getting Ninject and WebApi v1 (MVC4) to work让 Ninject 和 WebApi v1 (MVC4) 工作时出错
【发布时间】:2015-05-11 16:33:55
【问题描述】:

这是我收到的错误消息:

  "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 文件夹中,从 nuget 安装生成的 NinjectWebCommons.cs:

//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 的问题仍然存在,“找不到类型或命名空间名称‘IRequest’(您是否缺少 using 指令或程序集引用?)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();
    }
  ...

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api architecture dependency-injection ninject


    【解决方案1】:

    您问题的第一部分是正确的,但是您的 DmpeController 取决于 Logger 并且您没有注册该依赖项。请更新您的 RegisterServices 以注册该依赖项,它将起作用。

    我想 NInject 可以处理具体类型的注册和解析。如果这不可行,请提取ILogger 接口,并使构造函数依赖于ILogger,而不是依赖于具体类型Logger。

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多