Extension ActionDescriptorFilterProvider to allow nesting level filters

Follow Injection dependency injection authorization filter using ASP.New MVC 4 Web Api . Is there a way to use dependency injection for filters that are set globally in all controller classes:

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

It seems that method GetFiltersc ActionDescriptorFilterProvideronly works with method level filters.

public class UnityWebApiFilterAttributeFilterProvider : ActionDescriptorFilterProvider,
    System.Web.Http.Filters.IFilterProvider
{
private readonly IUnityContainer _container;

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

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

    this.BuildUpAttributes(filters);

    return filters;
}

private void BuildUpAttributes(IEnumerable filterInfo)
{
    foreach (FilterInfo filter in filterInfo)
    {
        object o = _container.BuildUp(filter.GetType(), filter);
    }
}
}
+4
source share
1 answer

If you want these global filters to be introduced, you will have to enable them from the container and add them to the filter collection:

GlobalFilters.Filters.Add(container.Resolve<MyFilter>());

Or do something like:

var filter = WebApplicationApiAuthorizeAttribute();
container.BuildUp(filter.Gettype(), filter);
GlobalFilters.Filters.Add(filter);

. ... . IoC: . , , concurrency, , .

, , , , . , - -, " ":

public sealed class UnityActionFilterProxy<TActionFilter> : IActionFilter
    where TActionFilter : IActionFilter
{
    private readonly IUnityContainer container;
    public UnityActionFilterProxy(IUnityContainer container) {
        this.container = container;
    }

    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext context,
        CancellationToken token, Func<Task<HttpResponseMessage>> continuation) {
        return this.container.Resolve<TActionFilter>().ExecuteActionFilterAsync(
            context, token, continuation);
    }

    public bool AllowMultiple { get { return false; } }
}

- :

GlobalFilters.Filters.Add(
    container.Resolve<UnityActionFilterProxy<MyFilter>>());

- Web API, ... . Handlers.

+4

Source: https://habr.com/ru/post/1533635/


All Articles