18

Sono davvero bloccato sull'approccio a fare l'iniezione delle dipendenze nel filtro azione di web api. Ho un filtro di un'azione del genere:Come eseguire l'iniezione delle dipendenze in Action Filter sull'API Web ASP.NET

public class AuthorizationAttribute : ActionFilterAttribute 
{ 
    public IApiKeyRepository Repository { get; set; } 

    private Guid GetApiKey(string customerKey) 
    { 
     return Repository.GetApiKey(customerKey); 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    {   
    } 
} 

Mi piacerebbe fare l'iniezione proprietà sul Repository proprietà utilizzando Windsor (ma non importa quale contenitore CIO viene utilizzato)

sono venuto fino a personalizzare FilterProvider ma non ha funzionato per me, qualcuno ha una soluzione o codice in esecuzione su questo? sarà molto apprezzato

risposta

1

È possibile utilizzare l'assembly Ninject.Web.WebApi (ovviamente usando Ninject come IoC) per fare in modo che funzioni. Vorrei suggerire di guardare l'origine e SampleApplication tramite https://github.com/ninject/Ninject.Web.WebApi per vedere come stanno ottenendo l'iniezione di filtri.

+0

Potete delineare i passaggi per utilizzare 'Ninject.Web.WebApi' per realizzare l'iniezione del filtro? La SampleApplication non è molto utile. –

+0

Ecco una buona descrizione di come funziona il LogFilter in SampleApplication: https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filters –

4

È necessario verificare l'implementazione di IOC specifica. Contenitori IOC come NInject e Autofac hanno un tipo di iniezione del filtro mediante l'iniezione di proprietà pubbliche. Windsor non sono sicuro, ma qui c'è un collegamento che crea un wrapper che potrebbe aiutare con Windsor: http://eagle081183.wordpress.com/2010/09/21/dependency-injection-with-asp-net-mvc-action-filters/ e un altro articolo che risolve direttamente il problema con Windsor: http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx.

Per completezza con Ninject e Autofac:

Ninject:

Autofac:

** EDIT - opzione aggiuntiva **

Si dovrebbe essere in grado di fare GlobalConfiguration.Configuration.DependencyResolver.GetService(...) da alcun filtro indipendentemente dal contenitore CIO che si sta utilizzando.

+0

+1 per AutoFac, corrisponde a piacevolmente con WebAPI – leon

+2

Grazie per la risposta, Alex, ma la maggior parte del link che hai mostrato è per MVC, non per le API Web, è una specie di iniezione diversa tra Web API e MVC, penso. –

+0

L'ho fatto con successo con Autofac ma non posso parlare con gli altri. Dovresti anche essere in grado di accedere al servizio che desideri direttamente dal filtro tramite GlobalConfiguration.Configuration.DependencyResolver.GetService (...). Non ideale, ma dovrebbe funzionare. – AlexGad

4

Per WebAPI e autofac è possibile utilizzare:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

La documentazione è here.

Problemi correlati