簡體   English   中英

全局應用時不調用WebApi操作篩選器依賴項注入

[英]WebApi action filter dependency injection not called when applied globally

我有一個簡單的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"
        });

    }
}

Unity過濾器提供程序...

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]屬性應用於控制器時,依賴項注入將正常工作,並且ILogger實例在異常過濾器中可用。

但是,當我嘗試全局配置過濾器時...

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

依賴關系未解決,嘗試從過濾器中訪問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);
        }
    }
}

所以我的建議是切換到構造函數注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM