Ninject 不会解析构造函数依赖项 - Web API 2

Ninject won't resolve constructor dependencies - Web API 2

我已经删除了 Unity,现在正尝试使用 Ninject 代替它。在大多数情况下它都可以工作,但是我无法让它与 Web 一起玩 API 2.

我有一个 NinjectWebCommon.cs 文件(除了添加一些如果我明确解析就可以正常工作的注册之外我没有改变),我可以看到它正在触发 Start 事件。然而,当我尝试访问网络 API 控制器时,它抱怨没有 public 无参数构造函数。

An error has occurred.","ExceptionMessage":"An error occurred when trying to create a controller of type 'PlaceOrderController'. Make sure that the controller has a parameterless public constructor.

我安装了这些 Nuget 包(昨天刚安装,所以应该都是最新版本):

Ninject

Ninject.Extensions.Conventions

Ninject.Web.Common

Ninject.Web.Common.WebHost

Ninject.Web.WebApi

Ninject.Web.WebApi.WebHost

在这个阶段我没有做任何聪明的事情,只是一个网络 API 控制器和一个构造函数,该构造函数采用依赖项实现接口。使用 Unity 我可以在几分钟内完成工作,但 Ninject 似乎是一场配置噩梦!

我还错过了哪些步骤?

NinjectWebCommons.cs

public static class NinjectWebCommon 
{
    static NinjectWebCommon()
    {
        Kernel = new InterceptAllModule();
    }

    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(() => CreateKernel(Kernel));
    }

    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        try
        {
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }
        catch
        {
            kernel.Dispose();
            throw;
        }
    }

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<MyInterface>().To<MyClass>().InSingletonScope();
    }
}

控制器:

public MyController : ApiController
{
    private readonly MyInterface _myInterface;

    public MyController(MyInterface myInterface)
    {
        _myInterface = myInterface;
    }

    . . .
}

根据错误消息,我认为控制器 "PlaceOrderController" 应该至少有一个 public 构造函数接受 MyInterface 作为唯一参数。

你能post控制器的代码吗?

您没有正确设置 DependencyResolver。我尝试了几个 Ninject 包,由于 Ninject 和 WebAPI(和 MVC)的版本不兼容,我无法开始工作。 这个post:http://www.codeproject.com/Articles/412383/Dependency-Injection-in-asp-net-mvc-and-webapi-us 详细描述了如何设置 WebAPI 以使用 Ninject 作为其依赖解析器。