带有Web API 2的MVC 4没有默认的构造函数错误

时间:2014-03-20 05:45:53

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

您好我正在使用MVC4和WebAPI2,我在 Ninject 中遇到了does not have a default constructor 错误(这是ninject上的一个已知错误)我使用 NinjectDependencyResolver 自定义类以及 WebApiContrib.Ioc.Ninject nuget以找出此错误。这是我的 NinjectWebCommon

我不确定是因为我的项目是分层的,所以层就像  我有“CompositionRoot”图层,其中添加了Ninject,我将此图层引用到我的主要Web图层。我的项目正在运行,但我的网页api没有返回json,请帮助我,我不能在没有得到这个修复的情况下前进,提前感谢。

public static class NinjectWebCommon {
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

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

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

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

        RegisterServices(kernel);
        GlobalConfiguration.Configuration.DependencyResolver = 
            new NinjectResolver(kernel);

        // I tested using below code as well (NinjectDependencyResolver 
        // is custom class to fix this issue )        
        //GlobalConfiguration.Configuration.DependencyResolver = 
        //    new NinjectDependencyResolver(kernel);
        return kernel;
    }

    private static void RegisterServices(IKernel kernel) {
        kernel.Bind<IUserBusiness>().To<UserBusiness>().InRequestScope();
        kernel.Bind<IUserDataAccess>().To<UserDataAccess>().InRequestScope();
    }        
}

1 个答案:

答案 0 :(得分:2)

德拉克斯,

在此时创建内核时,您不应将DependencyResolver分配给GlobalConfiguration。原因是Start()方法通常在WebActivator上运行,即使在ASP.NET WebAPI子系统或应用程序启动之前也会启动。

我的建议是将此依赖项解析程序的分配移至Global.asax内的WebApiConfig.csApp_Start

public static void Register(HttpConfiguration config)
{
    [...]
    //Dependency Resolver configuration
    config.DependencyResolver = new NinjectResolver((new Boostrapper).Kernel);

    // Configure routes and the rest of WebAPI stuff.
}

并且不要忘记Global.asax(它应该已经存在):

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

看看这是否适合你,让我们知道。如果没有,请使用您的NinjectResolver代码更新问题。