Ninject物业注射的WebAPI定制ExceptionFilterAttribute不工作 [英] Ninject Property Injection in WebAPI custom ExceptionFilterAttribute Not Working

查看:200
本文介绍了Ninject物业注射的WebAPI定制ExceptionFilterAttribute不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Ninject注入的事件记录实例到自定义ExceptionFilterAttribute。每当我运行code时,事件记录器实例为null。我已经实现了IFilterProvider在我的自定义AuthorizationFilterAttribute类似的方式来解决依赖关系,并且工作正常。任何想法?

无法正常工作

公共类ErrorHandlingAttribute:ExceptionFilterAttribute
{
    [注入]
    公共IEventLogger事件记录{搞定;组; }    公共覆盖无效onException的(HttpActionExecutedContext actionExecutedContext)
    {
       EventLogger.LogException(actionExecutedContext.Exception);        actionExecutedContext.Response = actionExecutedContext.Request。
            CreateResponse(的HTTPStatus code.BadRequest,
            新ServiceErrorResponseDTO(同时呼吁,出现未处理的异常+
                actionExecutedContext.Request.RequestUri.ToString()+
                此事件已被记录如果继续收到此错误,请联系维切特。));
    }
}

工作

公共类RequireAuthorizationAttribute:AuthorizationFilterAttribute
{
    [注入]
    公共IServiceRepository ServiceRepository {搞定;组; }    公共覆盖无效OnAuthorization(HttpActionContext ActionContext中)
    {
        #区域头认证        VAR authHeader = actionContext.Request.Headers.Authorization;
        如果(authHeader!= NULL)
        {

自定义IFilterProvider

公共类NinjectWebApiFilterProvider:IFilterProvider
{
    私人的iKernel _KERNEL;    公共NinjectWebApiFilterProvider(内核的iKernel)
    {
        _KERNEL =内核;
    }    公共IEnumerable的< FilterInfo> GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)
    {
        VAR controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters()选择(例如= GT;新FilterInfo(例如,FilterScope.Controller));
        VAR actionFilters = actionDescriptor.GetFilters()选择(例如= GT;新FilterInfo(例如,FilterScope.Action));        VAR过滤器= controllerFilters.Concat(actionFilters);        的foreach(在过滤器变种过滤器)
        {
            _kernel.Inject(filter.Instance);
        }        返回过滤器;
    }
}

NinjectWebCommon CreateKernel法

私有静态的iKernel CreateKernel()
    {
        VAR内核=新StandardKernel();
        kernel.Bind<&Func键LT;的iKernel>方式>()ToMethod(CTX =>()=>新建引导程序()内核。);
        kernel.Bind&所述; IHttpModule的方式>()到< HttpApplicationInitializationHttpModule>();        //用于Web API广告Ninject支持。
        GlobalConfiguration.Configuration.DependencyResolver =新NinjectDependencyResolver(内核);        GlobalConfiguration.Configuration.Services.Add(typeof运算(IFilterProvider)
            新NinjectWebApiFilterProvider(内核));        RegisterServices(内核);
        返回内核;
    }

NinjectWebCommon绑定

私有静态无效RegisterServices(内核的iKernel)
    {
        kernel.Bind&所述; ServiceDbContext方式>()到< ServiceDbContext>();
        kernel.Bind&所述; IServiceRepository方式>()到< ServiceRepository>();        kernel.Bind&所述; CareerDevelopmentDbContext方式>()到< CareerDevelopmentDbContext>();
        kernel.Bind&所述; ICareerDevelopmentRepository方式>()到< CareerDevelopmentRepository>();
        kernel.Bind&所述; ICareerDevelopmentService方式>()到< CareerDevelopmentService>();        kernel.Bind&所述; IEventLogger方式>()到< ServiceEventLogger>();
        kernel.Bind<IFilterProvider>().To<NinjectWebApiFilterProvider>().WithConstructorArgument(\"kernel\",核心);
    }


解决方案

好吧,你必须确保你绑定您的自定义 IFilterProvider 为好。至于写在 Ninject.Web.WebApi的的NuGet包是不稳定的,会自动为你做,如果你使用它。只是以同样的方式 Ninject.MVC3 这是否为常规控制器。

只要确保你有这样的结合,同时将被替换 DependencyResolver 将寻找 IFilterProvider 通过您的Ninject内核实现还有:

<$c$c>kernel.Bind<IFilterProvider>().To<NinjectWebApiFilterProvider>();

那么你的 NinjectWebApiFilterProvider 将踢,把依赖注入您的过滤器,按您的code。

I am trying to use Ninject to inject an EventLogger instance into a custom ExceptionFilterAttribute. Whenever I run the code, the EventLogger instance is null. I have implemented an IFilterProvider to resolve dependencies in a similar manner for my custom AuthorizationFilterAttribute, and that works fine. Any ideas?

Not Working

public class ErrorHandlingAttribute : ExceptionFilterAttribute
{
    [Inject]
    public IEventLogger EventLogger { get; set; }

    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
       EventLogger.LogException(actionExecutedContext.Exception);

        actionExecutedContext.Response = actionExecutedContext.Request.
            CreateResponse(HttpStatusCode.BadRequest, 
            new ServiceErrorResponseDTO("An unhandled exception occurred while calling " + 
                actionExecutedContext.Request.RequestUri.ToString() + 
                ". This event has been logged. If you continue to receive this error contact Weichert"));
    }
}

Working

public class RequireAuthorizationAttribute : AuthorizationFilterAttribute
{
    [Inject]
    public IServiceRepository ServiceRepository { get; set; }

    public override void OnAuthorization(HttpActionContext actionContext)
    {


        #region Header Authentication

        var authHeader = actionContext.Request.Headers.Authorization;
        if (authHeader != null)
        {

Custom IFilterProvider

public class NinjectWebApiFilterProvider : IFilterProvider
{
    private IKernel _kernel;

    public NinjectWebApiFilterProvider(IKernel kernel)
    {
        _kernel = kernel;
    }

    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller));
        var actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action));

        var filters = controllerFilters.Concat(actionFilters);

        foreach(var filter in filters)
        {
            _kernel.Inject(filter.Instance);
        }

        return filters;
    }
}

NinjectWebCommon CreateKernel Method

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

        // Ad Ninject support for Web API.
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

        GlobalConfiguration.Configuration.Services.Add(typeof(IFilterProvider), 
            new NinjectWebApiFilterProvider(kernel));

        RegisterServices(kernel);
        return kernel;
    }

NinjectWebCommon Bindings

private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ServiceDbContext>().To<ServiceDbContext>();
        kernel.Bind<IServiceRepository>().To<ServiceRepository>();

        kernel.Bind<CareerDevelopmentDbContext>().To<CareerDevelopmentDbContext>();
        kernel.Bind<ICareerDevelopmentRepository>().To<CareerDevelopmentRepository>();
        kernel.Bind<ICareerDevelopmentService>().To<CareerDevelopmentService>();

        kernel.Bind<IEventLogger>().To<ServiceEventLogger>();
        kernel.Bind<IFilterProvider>().To<NinjectWebApiFilterProvider>().WithConstructorArgument("kernel", kernel);
    }        

解决方案

Ok, you have to make sure you are binding your custom IFilterProvider as well. As of writing the Ninject.Web.WebApi Nuget package is unstable and would do that automatically for you, if you were using it. Just in the same fashion Ninject.MVC3 does this for your regular controllers.

Just make sure you have this binding, and the replaced DependencyResolver will look for IFilterProvider implementation via your Ninject kernel as well:

kernel.Bind<IFilterProvider>().To<NinjectWebApiFilterProvider>();

Then your NinjectWebApiFilterProvider will kick in and inject dependencies into your filters as per your code.

这篇关于Ninject物业注射的WebAPI定制ExceptionFilterAttribute不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆