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

时间:2015-05-08 09:13:58

标签: .net ninject asp.net-web-api2

我已删除Unity,现在正尝试在其位置使用Ninject。在大多数情况下它都可以工作,但是我无法使用Web API 2。

我有一个NinjectWebCommon.cs文件(我没有改变,除了添加一些注册,如果我明确解决,它工作正常),我可以看到它是触发一个Start事件。但是,当我尝试访问Web API控制器时,它会抱怨没有公共无参数构造函数。

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

我在这个阶段没有做任何聪明的事情,只是一个带有构造函数的Web 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;
    }

    . . .
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

从错误消息中,我认为控制器&#34; PlaceOrderController&#34;应该至少有一个公共构造函数接受MyInterface作为唯一的参数。

你可以发布控制器的代码吗?