Asp.net mvc 5 Ninject不使用Asp.Net WebApi
我见过很多人问这个问题,并尝试过他们所接受的答案,但没有一个对我有用 当我尝试将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
{ "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);
}