gpt4 book ai didi

asp.net-mvc-5 - Ninject 不适用于 Asp.Net WebApi

转载 作者:行者123 更新时间:2023-12-04 17:21:28 25 4
gpt4 key购买 nike

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

当我尝试将 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)" } }

我的 Controller :

using Analyzer.Models.ModelsForApp;
using Analyzer.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Analyzer.Controllers
{
public class SubjectPostsController : ApiController
{
private IRepository _repo;
public SubjectPostsController(IRepository repo)
{
_repo = repo;
}
public IEnumerable<SubjectPost> Get()
{
var posts = _repo.GetSubjectPosts()
.OrderByDescending(p =>p.Created).ToList();
return posts;

}
}
}

Ninject.WebCommon:

[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();
}
}

我安装的nuget包是:

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

到目前为止,我已经尝试了很多可能性,当我尝试该方法时,GlobalConfiguration.Configuration.DependencyResolver 抛出异常。

所以基本上,我的想法已经用完了。有谁知道如何解决这个问题?

更新:我尝试使用 Unity 解决这个问题并且成功了。虽然我不知道使用unity有什么弊端以及它得到的支持量(好像快一年没更新了)。正在研究更多关于 unity 的内容,但我仍然对使用 Ninject 的解决方案感兴趣。

更新 2:它也适用于 SimpleInjector...我开始认为问题出在 Ninject 上。谁能让 Ninject 与 WebApi 一起工作?

最佳答案

我使用以下内容:

    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 解决 ApiControlelrs 上的注入(inject)
  • MvcDependencyResolver 解决 Mvc Controller 上的注入(inject)

您可以在 https://gist.github.com/remojansen/d907f8e2c2c4bfb7f65e 找到完整的实现

关于asp.net-mvc-5 - Ninject 不适用于 Asp.Net WebApi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com