Ninject不解析依赖(无参数构造函数错误)

时间:2015-08-13 08:42:10

标签: c# dependency-injection ninject asp.net-web-api2

我正在努力在Web服务应用程序中启用Ninject的构造函数注入。这是我采取的步骤(Visual Studio 2013):

1)使用“ASP.NET Web应用程序”模板创建了一个新项目。

2)在项目创建向导的第二步中选择“空”应用程序模板。

3)在第三步中,为“添加文件夹和核心参考”选择“Web API”

4)项目已创建,现在我添加了一个“Web API 2 Controller - Empty”类型的控制器。添加了以下代码:

using System.Web.Http;

namespace WebApplication1.Controllers
{
    public interface IDummy
    {
    }

    public class Dummy : IDummy
    {
    }

    public class DefaultController : ApiController
    {
        public DefaultController(IDummy dummy)
        {
        }

        [HttpGet]
        [Route("")]
        public string Index()
        {
            return "Hello World!";
        }
    }
}

5)安装的NuGet包:Ninject.Web.WebApi(WebApi2的Ninject集成),现在我发现在其他线程中使它与IIS一起工作我需要安装Ninject.Web.Common.WebHost包。在此之后,NinjectWebCommon.cs文件出现在AppStart中。我为这个文件做的唯一编辑是RegisterServices方法:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IDummy>().To<Dummy>();
}

现在,当我尝试运行应用程序(本地,只需在Visual Studio中按F5)时,我希望在浏览器中获取Hello World字符串,但是我得到了臭名昭着的无参数构造函数错误: Error 这意味着Ninject由于某种原因不能正常工作。不幸的是谷歌搜索解决方案到目前为止没有结果。任何人都可以暗示我该怎么做才能使这项工作?提前谢谢。

1 个答案:

答案 0 :(得分:0)

通过使用this solution,我能够非常简单地完成这项工作。您只需安装Ninject.Web.WebApi,然后添加以下代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Dependencies;
using Ninject;
using Ninject.Activation;
using Ninject.Parameters;
using Ninject.Syntax;

internal class NinjectDependencyResolver : NinjectScope, IDependencyResolver
{
    private readonly IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel)
        : base(kernel)
    {
        if (kernel == null)
            throw new ArgumentNullException("kernel");

        this.kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectScope(this.kernel.BeginBlock());
    }
}

internal 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();
    }
    public void Dispose()
    {
        IDisposable disposable = (IDisposable)resolutionRoot;
        if (disposable != null) disposable.Dispose();
        resolutionRoot = null;
    }
}

用法

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        IKernel kernel = new StandardKernel();

        kernel.Bind<IDummy>().To<Dummy>();

        config.DependencyResolver = new NinjectDependencyResolver(kernel);

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}