Unity dependency injection with global web API filter attribute

Link to this CodePlex unity article I managed to get a filter attribute that works with a WebAPI controller as follows:

[MyFilterAttribute] public class TestController : ApiController {} 

However, if I want to apply my filter attribute to all actions using GlobalConfiguration, it will be deprived of a nested dependency:

 public class MyFilterAttribute : ActionFilterAttribute { [Dependency] public MyDependency { get; set; } public override void OnActionExecuting(HttpActionContext actionContext) { if (this.MyDependency == null) //ALWAYS NULL ON GLOBAL CONFIGURATIONS throw new Exception(); } } public static class UnityWebApiActivator { public static void Start() { var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer()); GlobalConfiguration.Configuration.DependencyResolver = resolver; GlobalConfiguration.Configuration.Filters.Add(new MyFilterAttribute()); RegisterFilterProviders(); } private static void RegisterFilterProviders() { var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList(); GlobalConfiguration.Configuration.Services.Add( typeof(System.Web.Http.Filters.IFilterProvider), new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer())); var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider); GlobalConfiguration.Configuration.Services.Remove( typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider); } } 

Is there a better place to add a global configuration?

+7
c # asp.net-web-api unity-container
source share
1 answer

The problem arises because you add a new set of MyFilterAttribute to the filter collection (i.e.: GlobalConfiguration.Configuration.Filters.Add(**new MyFilterAttribute()**) ) as opposed to an instance permitted through Unity. Since Unity is not involved in instantiating, it does not have a trigger for dependency injection. This needs to be fixed by simply allowing the instance through Unity. eg:.

 GlobalConfiguration.Configuration.Filters.Add((MyFilterAttribute)resolver.GetService(typeof(MyFilterAttribute())); 
+13
source share

All Articles