8

Non riesco a ottenere l'integrazione delle dipendenze lavorando con una classe ActionFilterAttribute personalizzata utilizzando il bootstrapper Unity per ASP.NET Web Pacchetto nuget API.Impossibile eseguire l'iniezione su System.Web.Http.Filters.ActionFilterAttribute utilizzando Unity bootstrapper per il pacchetto nuget API Web ASP.NET

Ho registrato il tipo in UnityConfig e lo sto usando altrove (usando comunque l'iniezione del costruttore) e funziona perfettamente.

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ISettingService, SettingService>(); 
    ... 
} 

Il codice viene chiamato correttamente, tuttavia l'oggetto istanziato (settingService) è nullo.

public class APIKeyValidationAttribute : ActionFilterAttribute 
{ 
    [Dependency] 
    public ISettingService settingService { get; set; } 

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    ... 
    if (settingService == null) 
    { 
     throw new Exception("settingService is null"); 
    } 
    ... 
} 

Cosa devo fare per farlo funzionare? Ho cercato per molto tempo e posso trovare solo esempi per MVC o per Web API con diversi iniettori di dipendenze.

risposta

8

prima creare un IFilterProvider che eseguirà un accumulo e iniettare le dipendenze:

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; 
    } 
} 

quindi registrare l'IFilterProvider:

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); 
} 

ho messo questo metodo e invocato nella classe UnityWebApiActivator.

+0

Grazie mille Tuzo. Ho creato una nuova classe, aggiunto il metodo RegisterFilterProviders nella classe UnityWebApiActivator add aggiunto lo spazio dei nomi per la nuova classe. Questo errore viene generato 'System.Collections.Generic.IEnumerable ' non contiene una definizione per 'ToList' e nessun metodo di estensione 'ToList' che accetta un primo argomento di tipo 'System.Collections .Generic.IEnumerable 'potrebbe essere trovato (ti manca una direttiva using o un riferimento di assembly?) Ci sono altri namespace che devo aggiungere? –

+0

@MichaelS: 'ToList()' è un metodo di estensione in 'System.Linq'. Aggiungi 'using System.Linq;' all'inizio del tuo file per risolvere questo errore di compilazione. –

+0

Grazie, ha funzionato bene. Per qualche ragione non c'era l'opzione "Risolvi" quando ho fatto clic con il tasto destro su di esso. –

Problemi correlati