让Ninject和WebApi v1(MVC4)工作时出错

时间:2015-05-09 23:48:00

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

这是我收到的错误消息:

  "Type 'GDMServices.Controllers.DmpeController' does not have a default constructor",

我开始沿着这条路走下去,因为答案似乎适用于几个用户,但我开始收到错误,这让我觉得有些事情发生了变化并放弃了解决方案。其中一个错误是无法解析IRequest,即使我添加了对System.Web.Http.Services的引用(我认为它是MVC3依赖项)。

Ninject and ASP.NET Web API

我看到了几个使用统一的例子,但我真的想坚持使用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的问题仍然存在,&#34;类型或命名空间名称&#39; IRequest&#39;找不到(你是否缺少using指令或程序集引用?)C:\ dev \ git-repo \ GDM.Data \ GDMServices \ Services \ App_Start \ NinjectWebCommon.cs&#34;。我没有按照规定安装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();
    }
  ...

1 个答案:

答案 0 :(得分:1)

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

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