2016-02-25 149 views
0

我有一个简单的WebAPI行动(例外)过滤器...的WebAPI行为过滤依赖注入

public class LogExceptionAttribute : ExceptionFilterAttribute 
{ 
    [Dependency] 
    public ILogger Logger { get; set; } 

    public override void OnException(HttpActionExecutedContext context) 
    { 
     Logger.Fatal(context.Exception, "Critical exception in request to WebApi controller."); 

     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) 
     { 
      Content = new StringContent("Internal Server Error."), 
      ReasonPhrase = "Critical Exception" 
     }); 

    } 
} 

一支团结过滤器供应商...

public class UnityFilterProvider : IFilterProvider 
{ 
    private IUnityContainer _container; 
    private readonly ActionDescriptorFilterProvider _defaultProvider = new ActionDescriptorFilterProvider(); 

    public UnityFilterProvider(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) 
    { 
     var attributes = _defaultProvider.GetFilters(configuration, actionDescriptor); 

     foreach (var attr in attributes) 
     { 
      _container.BuildUp(attr.Instance.GetType(), attr.Instance); 
     } 
     return attributes; 
    } 
} 

而下面配置为统一...

var providers = config.Services.GetFilterProviders().ToList(); 
config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(container)); 
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); 
config.Services.Remove(typeof(IFilterProvider), defaultprovider); 

var logger = LogFactory.CreateWebApiLogger(); 
container.RegisterInstance<ILogger>(logger); 

当将[LogException]属性应用于cont滚动,依赖注入正常工作,并且异常过滤器中可用的ILogger实例。

然而,当我试图全局配置过滤器...

config.Filters.Add(new LogExceptionAttribute()); 

的依赖性还没有解决,我得到一个空引用异常,同时试图从过滤器中访问ILogger实例。

我错过了什么?

回答

0

尝试

config.Filters.Add((IExceptionFilter)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(LogExceptionAttribute))); 

追加

您的评论后,我检查我的更远。

我有构造函数依赖

public class LogExceptionAttribute : ExceptionFilterAttribute, IExceptionFilter 
{ 
    private ILogger Logger { get; set; } 

    public LogExceptionAttribute (ILogger logger) 
    { 
     this.Logger = logger; 
    } 

    public override void OnException(HttpActionExecutedContext context) 
    { 
     if (context.Exception != null) 
     { 
      this.Logger.LogException(context.Exception); 
     } 
    } 
} 

所以我的建议是切换到构造器注入。

+0

在System.Web.Http.dll中发生类型'System.ArgumentNullException'的异常,但未在用户代码中处理 –

+0

我做了一个追加 – granadaCoder

+0

我不认为有可能使用构造函数注入与actionfilterattribute? –