1

I am trying to get work with dependency injection into the action filter, but it seems not working

I've registered the type in UnityConfig

    public static void RegisterComponents(IUnityContainer container)
    {
        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        container.RegisterType<Domain.Contracts.IUserServices, Domain.UserServices>(new ContainerControlledLifetimeManager());
        ...
    }

The code is being called successfully, however, the instantiated object (IUserServices) is null.

public class ValidationActionFilter : ActionFilterAttribute
{
    [Dependency]
    public IUserServices userServices { get; set; }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var isValidUser = userServices.IsAValidUserForCompany("MyCompany", 123);
        ....
     }
}

I have tried to use following link solution, but this does not seem working for me because it IUnityContainer is null for me always

Solution

First, I have created an IFilterProvider

public class UnityActionFilterProvider
         : ActionDescriptorFilterProvider, IFilterProvider
{
      private readonly IUnityContainer container;

      public UnityActionFilterProvider(IUnityContainer container)
      {
           this.container = container;
      }

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

           foreach (var filter in filters)
           {
             container.BuildUp(filter.Instance.GetType(), filter.Instance);
           }

           return filters;
       }
}

Then registered the IFilterProvider in global.asax

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        UnityConfig.RegisterComponents(UnityConfig.GetConfiguredContainer());


        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);
    }
}
Nkosi
  • 235,767
  • 35
  • 427
  • 472
M005
  • 824
  • 1
  • 9
  • 25
  • Possible duplicate of [Constructor Dependency Injection WebApi Attributes](https://stackoverflow.com/questions/28352680/constructor-dependency-injection-webapi-attributes) – NightOwl888 Dec 29 '17 at 08:47
  • What version of Unity are you using? – Randy Levy Dec 29 '17 at 11:23
  • @RandyLevy I am using Unity 4.0.1 & Unity.WebAPI 5.2.3 – M005 Dec 29 '17 at 11:25
  • One quick check that I've seen cause issues before: you can verify that `[Dependency]` is actually of type `Microsoft.Practices.Unity.DependencyAttribute` and not another type such as `System.Runtime.CompilerServices.DependencyAttribute`. – Randy Levy Dec 29 '17 at 13:05
  • @RandyLevy it is type of Microsoft.Practices.Unity.DependencyAttribute – M005 Dec 29 '17 at 17:49
  • Possible duplicate of [Using Unity to inject dependencies into a custom ActionFilter](https://stackoverflow.com/questions/8199618/using-unity-to-inject-dependencies-into-a-custom-actionfilter) – Orel Eraki Jan 04 '18 at 12:09
  • @M005 - Please add your solution as an answer, so this question can be resolved. – NightOwl888 Feb 07 '18 at 05:28

0 Answers0