Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 5 Ninject不使用Asp.Net WebApi_Asp.net Mvc 5_Ninject_Asp.net Web Api2 - Fatal编程技术网

Asp.net mvc 5 Ninject不使用Asp.Net WebApi

Asp.net mvc 5 Ninject不使用Asp.Net WebApi,asp.net-mvc-5,ninject,asp.net-web-api2,Asp.net Mvc 5,Ninject,Asp.net Web Api2,我见过很多人问这个问题,并尝试过他们所接受的答案,但没有一个对我有用 当我尝试将Ninject与我的asp.net webapi一起使用时,我不断遇到此错误 { "Message": "An error has occurred.", "ExceptionMessage": "An error occurred when trying to create a controller of type 'SubjectPostsController'. Make sure that the co

我见过很多人问这个问题,并尝试过他们所接受的答案,但没有一个对我有用

当我尝试将Ninject与我的asp.net webapi一起使用时,我不断遇到此错误

 { "Message": "An error has occurred.", "ExceptionMessage": "An error
 occurred when trying to create a controller of type
 'SubjectPostsController'. Make sure that the controller has a
 parameterless public constructor.", "ExceptionType":
"System.InvalidOperationException", "StackTrace": " at
System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create
(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type
controllerType)\ \ at
System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage
request)\ \ at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext ()",
"InnerException": { "Message": "An error has occurred.",
"ExceptionMessage": "Type
'Analyzer.Controllers.SubjectPostsController' does not have a default
 constructor", "ExceptionType": "System.ArgumentException",
"StackTrace": " at System.Linq.Expressions.Expression.New(Type type)\
\ at System.Web.Http.Internal.TypeActivator.Create[TBase](Type
instanceType)\ \ atSystem.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage
request, Type controllerType, Func`1& activator)\ \ at  System.Web.Http.Dispatcher.DefaultHttpControllerActivator.CreateHttpRequestMessa ge
request, HttpControllerDescriptor controllerDescriptor, Type
controllerType)" } }
到目前为止,我已经尝试了很多可能性, 当我尝试该方法时,GlobalConfiguration.Configuration.DependencyResolver引发异常

所以基本上,我已经没有想法了。有人知道如何解决这个问题吗

更新:我试着用Unity解决这个问题,它成功了。虽然我不知道使用unity的缺点以及它得到的支持量(它似乎已经有将近一年没有更新了)。更多地研究unity,但我仍然对使用Ninject的解决方案感兴趣

更新2:它也适用于SimpleInjector…我开始认为问题来自Ninject。任何人都可以使用WebApi使用Ninject吗?

我使用以下方法:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        var dependencyInjectionProvider = new DependencyInjectionProvider();

        // Set MVC depencendy resolver for asp mvc web project
        DependencyResolver.SetResolver(dependencyInjectionProvider.GetMvcDependencyResolver());

        // Set MVC depencendy resolver for asp mvc web API project
        GlobalConfiguration.Configuration.DependencyResolver = dependencyInjectionProvider.GetHttpDependencyResolver();


        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
DependencyInjectionProvider有两个内部组件:

  • HttpDependencyResolver
    解析APIControlLRS上的注入
  • MvcDependencyResolver
    解决Mvc控制器上的注入问题

您可以在

@NightOwl888上找到完整的实现,因此在我的WepApiConfig.Register中,我是否应该有一个类似“var k=new standardckernel();config.dependencysolver=new ninjectdependencysolver(k);?@NigtOwl888,我尝试过,得到了与尝试使用全局配置时相同的异常…”检测到循环依赖项。。“这个问题对你不管用吗@davethieben不是很遗憾。好吧,我稍后会检查。现在我的手上都是项目。非常感谢您的回复,当我尝试时,我肯定会通知您这是否有效。我从来没有时间尝试这一点,并继续使用其他项目和simpleInjector。不是一些解决方案,但我不是在API控制器中使用DI,而是调用实现的新实例:)
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof  Analyzer.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof (Analyzer.App_Start.NinjectWebCommon), "Stop")]

namespace Analyzer.App_Start
{
    using System;
    using System.Web;

using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Common;
using Analyzer.Database;
using Analyzer.Repository;
using System.Web.Http;


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

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    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;
        }
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ApplicationDbContext>().To<ApplicationDbContext>().InRequestScope();
        kernel.Bind<IRepository>().To<Repository>().InRequestScope();
    }        
}
Ninject version 3.2.2.0
Ninject integration for WepApi2 3.2.4.0
Ninject Web Host for WebApi2 3.2.4.0
Ninject.MVC3 3.2.1.0
Ninject.Web 3.2.1.0
Ninject.Web.Common 3.2.3.0
Ninject.Web.Common.WebHost 3.2.3.0
WebApiContrib.IoC.Ninject
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        var dependencyInjectionProvider = new DependencyInjectionProvider();

        // Set MVC depencendy resolver for asp mvc web project
        DependencyResolver.SetResolver(dependencyInjectionProvider.GetMvcDependencyResolver());

        // Set MVC depencendy resolver for asp mvc web API project
        GlobalConfiguration.Configuration.DependencyResolver = dependencyInjectionProvider.GetHttpDependencyResolver();


        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }