Error handling WebAPI自定义ExceptionFilterAttribute中的NinObject属性注入不起作用

Error handling WebAPI自定义ExceptionFilterAttribute中的NinObject属性注入不起作用,error-handling,asp.net-web-api,ninject,Error Handling,Asp.net Web Api,Ninject,我正在尝试使用Ninject将EventLogger实例注入自定义ExceptionFilterAttribute。无论何时运行代码,EventLogger实例都为null。我已经实现了一个IFilterProvider,以类似的方式为我的自定义AuthorizationFilterAttribute解决依赖关系,这很好。有什么想法吗 不工作 公共类ErrorHandlingAttribute:ExceptionFilterAttribute { [注入] 公共IEventLogger事件记录器

我正在尝试使用Ninject将EventLogger实例注入自定义ExceptionFilterAttribute。无论何时运行代码,EventLogger实例都为null。我已经实现了一个IFilterProvider,以类似的方式为我的自定义AuthorizationFilterAttribute解决依赖关系,这很好。有什么想法吗

不工作

公共类ErrorHandlingAttribute:ExceptionFilterAttribute
{
[注入]
公共IEventLogger事件记录器{get;set;}
public override void OneException(HttpActionExecuteContext ActionExecuteContext)
{
LogException(ActionExecuteContext.Exception);
ActionExecuteContext.Response=ActionExecuteContext.Request。
CreateResponse(HttpStatusCode.BadRequest,
new ServiceErrorResponseDTO(“调用时发生未处理的异常”+
actionExecutedContext.Request.RequestUri.ToString()+
“。此事件已被记录。如果您继续收到此错误,请联系Weichert”);
}
}
工作

公共类RequireAuthorizationAttribute:AuthorizationFilterAttribute
{
[注入]
公共IServiceRepository服务存储库{get;set;}
授权时的公共覆盖无效(HttpActionContext actionContext)
{
#区域标头身份验证
var authHeader=actionContext.Request.Headers.Authorization;
if(authHeader!=null)
{
自定义IFilterProvider

公共类NinjectWebApilterProvider:IFilterProvider
{
私有IKernel_内核;
公共NinjectWebApilterProvider(IKernel内核)
{
_内核=内核;
}
公共IEnumerable GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)
{
var controllerFilters=actionDescriptor.ControllerDescriptor.GetFilters().Select(实例=>new FilterInfo(实例,FilterScope.Controller));
var actionFilters=actionDescriptor.GetFilters().Select(实例=>newfilterInfo(实例,FilterScope.Action));
var filters=controllerFilters.Concat(actionFilters);
foreach(过滤器中的var过滤器)
{
_注入(filter.Instance);
}
回流过滤器;
}
}
NinjectWebCommon CreateKernel方法

private静态IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
//对Web API的Ad-Ninject支持。
GlobalConfiguration.Configuration.DependencyResolver=新的NinjectDependencyResolver(内核);
GlobalConfiguration.Configuration.Services.Add(类型)(IFilterProvider),
新的NinjectWebApiFilterProvider(内核);
注册服务(内核);
返回内核;
}
NinjectWebCommon绑定

私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To().WithConstructorArgument(“kernel”,kernel);
}        

好的,您必须确保您也绑定了自定义的
IFilterProvider
。在编写Ninject.Web.WebApi时,Nuget包是不稳定的,如果您正在使用它,它会自动为您执行此操作。就像Ninject.MVC3为常规控制器执行此操作一样

只需确保您具有此绑定,替换的
dependencysolver
也将通过您的Ninject内核查找
IFilterProvider
实现:

kernel.Bind().To();

然后,您的
NinjectWebApiFilterProvider
将启动,并根据您的代码将依赖项注入过滤器。

我遇到了相同的问题,并以相同的方式配置了错误处理程序,将其添加到
WebApiConfig.cs
中的过滤器集合中,这意味着它没有被
FilterProvider
处理我添加了实现。因此我改为:

public class LoggingExceptionFilterAttribute : ExceptionFilterAttribute, IExceptionFilter
{
    // this is what I wanted injected
    private IEmailService emailService;

    public LoggingExceptionFilterAttribute(IEmailService service)
    {
        emailService = service;
    }

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        // my implementation here
    }
}
然后我在NinjectWebCommon中注册了这个,如下所示:

kernel.Bind<System.Web.Http.Filters.IExceptionFilter>().To<LoggingExceptionFilterAttribute>().InSingletonScope();

现在Ninject负责构造我的异常过滤器,我甚至可以进行构造函数注入,而不需要
[Inject]
attributes,我不必向每个API控制器添加我的
ExceptionFilterAttribute

你绑定了它吗?我们可以看看你的绑定吗?@cvbarros我修改了上面的帖子,加入了我的绑定。谢谢你看这个!为了清楚起见,
不需要将内核作为构造函数参数传入。Ninject automaTally为您注入所有
IKernel`参数。我遇到了与我一直在处理的问题完全相同的问题,并生成了几乎完全相同的代码,结果完全相同。它不会绑定到我的自定义
ExceptionFilterAttribute
。我看到您也遇到了与添加到
config.Filters.Add
中相同的问题,但确实如此y有比必须向每个控制器添加属性更好的方法吗?不幸的是,这不起作用。对事件记录器的引用仍然为空。我用更新的绑定修改了我原来的问题,并指出我指向了NinjectWebCommon->CreateKernel GlobalConfiguration.Co中的自定义筛选器configuration.Services.Add(typeof(IFilterProvider),new NinjectWebApilterProvider(kernel));我准确地复制了您的代码并使其正常工作,有些地方出了问题,我看不到:(.您的项目完全是WebAPI?另一件事:不要在
GlobalConfiguration
中替换
IFilterPRovider`。您提供的
DependencyResolver
可以解决这个问题,只要您有绑定
config.Filters.Add((IFilter)config.DependencyResolver.GetService(typeof(IExceptionFilter)));