C# 全局应用时未调用WebApi操作筛选器依赖项注入
我有一个简单的WebApi操作(异常)过滤器C# 全局应用时未调用WebApi操作筛选器依赖项注入,c#,asp.net-web-api,dependency-injection,unity-container,C#,Asp.net Web Api,Dependency Injection,Unity Container,我有一个简单的WebApi操作(异常)过滤器 public class LogExceptionAttribute : ExceptionFilterAttribute { [Dependency] public ILogger Logger { get; set; } public override void OnException(HttpActionExecutedContext context) { Logger.Fatal(contex
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;
}
}
依赖关系未被解析,我在尝试从筛选器中访问ILogger实例时遇到空引用异常
我错过了什么?试试看
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);
}
}
}
因此,我的建议是切换到构造函数注入。System.Web.Http.dll中发生了类型为“System.ArgumentNullException”的异常,但未在用户代码中处理。我认为不可能将构造函数注入与actionfilterattribute一起使用?我为“LogExceptionAttribute”发布的代码(类名称除外)这正是我所拥有的……。可能也是为什么我的原始代码snipplet的语法略有不同。@JamesLaw-可以使用构造函数注入,但必须将
IActionFilter
与属性
分开,并全局注册IActionFilter
,如中所示。
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);
}
}
}