jpsjph
jpsjph

Reputation: 135

can't get unity DependencyResolver work in webapi Filters

I am using Unity.WebAPI on my project when I try to call DependencyResolver on attribute is return null. Here is my code:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MSIAuthorizeAttribute : AuthorizationFilterAttribute
{
    private bool _perUser;
    private ISecurityService _securityService;

    /// <summary>
    /// constractor for MSIAuthorizeAttribute
    /// </summary>
    public MSIAuthorizeAttribute(bool perUser = true)
    {
        _perUser = perUser;
    }
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        var persistenceService = DependencyResolver.Current.GetService<IPersistenceService>();
        var logService = DependencyResolver.Current.GetService<ILogService>();
        var vbUtilities = DependencyResolver.Current.GetService<IVBUtilities>();
        _securityService = new SecurityService(persistenceService,logService,vbUtilities);
        ...
    }
}

Upvotes: 2

Views: 798

Answers (2)

jpsjph
jpsjph

Reputation: 135

To Janki

I found the answer, you need to register the filter in place you defined the dependency injection container. Here is an example:

public static void RegisterFilterProviders(HttpConfiguration config)
{
    var providers = config.Services.GetFilterProviders().ToList();
    config.Services.Add(typeof(IFilterProvider), new UnityActionFilterProvider(GetConfiguredContainer()));

    var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
    config.Services.Remove(typeof(IFilterProvider), defaultprovider);
}

Then in WebApiConfig.cs, add this line of code:

UnityConfig.RegisterFilterProviders(config);

Upvotes: 1

jpsjph
jpsjph

Reputation: 135

I found the solution:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MSIAuthorizeAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    private bool _perUser;
    private ISecurityService _securityService;
    [Dependency]
    public ILogService LogService { get; set; }
    [Dependency]
    public IVBUtilities VbUtilities { get; set; }
    [Dependency]
    public IPersistenceService PersistenceService { get; set; }

    /// <summary>
    /// constractor for MSIAuthorizeAttribute
    /// </summary>
    public MSIAuthorizeAttribute( bool perUser = true)
    {
        _perUser = perUser;
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionContext)
    {...}

http://unity.codeplex.com/discussions/446780

Upvotes: 0

Related Questions