18

Ich bin wirklich stecken auf dem Ansatz, Abhängigkeitseinleitung in Aktion Filter von Web-API zu tun. Ich habe ein Action-Filter wie folgt aus:Wie Dependency Injection zu Aktion Filter auf ASP.NET-Web-API

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

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

    public override void OnActionExecuting(HttpActionContext actionContext) 
    {   
    } 
} 

Ich möchte Eigenschaft Injektion auf dem Grundstück Repository zu tun, indem Windsor mit (aber es ist egal, welche IoC-Container verwendet wird)

Ich kam bis zu FilterProvider anpassen, aber es hat für mich nicht geklappt, hat jemand eine Lösung oder einen Code? es wird sehr geschätzt werden

Antwort

1

Sie können die Ninject.Web.WebApi Assembly verwenden (offensichtlich Ninject als IoC verwenden), um dies zu arbeiten. Ich würde vorschlagen, die Quelle und SampleApplication über https://github.com/ninject/Ninject.Web.WebApi zu sehen, um zu sehen, wie sie Filterinjektion erreichen.

+0

Können Sie die Schritte zur Verwendung von 'Ninject.Web.WebApi' zur Durchführung der Filterinjektion beschreiben? Die SampleApplication ist nicht sehr hilfreich. –

+0

Hier ist ein guter Überblick darüber, wie der LogFilter in der SampleApplication funktioniert - https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filters –

4

Sie müssen Ihre spezifische IOC-Implementierung überprüfen. IOC-Container wie NInject und Autofac haben eine Art Filterinjektion, indem sie öffentliche Eigenschaften injizieren. Windsor Ich bin mir nicht sicher, aber hier ist ein Link, der einen Wrapper erstellt, der mit Windsor helfen könnte: http://eagle081183.wordpress.com/2010/09/21/dependency-injection-with-asp-net-mvc-action-filters/ und ein anderer Artikel, der direkt das Problem mit Windsor anspricht: http://weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx.

Der Vollständigkeit halber mit ninject und Autofac:

ninject:

Autofac:

** EDIT - zusätzliche Option **

sollten Sie in der Lage sein GlobalConfiguration.Configuration.DependencyResolver.GetService(...) von jedem Filter zu tun, unabhängig von der IOC-Container Sie verwenden.

+0

+1 für AutoFac, es entspricht schön mit WebAPI – leon

+2

Vielen Dank für Ihre Antwort Alex, aber der Großteil der Link, den Sie gezeigt haben, ist für MVC, nicht für Web-API, es ist irgendwie anders, Injektion zwischen Web-API und MVC, denke ich. –

+0

Ich habe dies erfolgreich mit Autofac getan, kann aber nicht mit den anderen sprechen. Sie sollten auch direkt über den Filter über GlobalConfiguration.Configuration.DependencyResolver.GetService (...) auf den gewünschten Dienst zugreifen können. Nicht ideal, aber es sollte funktionieren. – AlexGad

4

Für WebAPI und Autofac können Sie:

builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

Die Dokumentation ist here.