2016-05-15 16 views
11

Ich versuche, DI auf ActionFilters in ASP.NET WebAPI mit Ninject einzurichten. Ich folgte den Anweisungen hier: https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filtersDependency Injection für ASP.NET WebAPI ActionFilters mit Ninject funktioniert nicht

Ich eröffne mein Action wie so:

public class ApiAuthorizeFilter : AbstractActionFilter 
{ 
    private readonly IValidateApiTokenService _validateApiTokenService; 

    public ApiAuthorizeFilter(IValidateApiTokenService validateApiTokenService) 
    { 
     _validateApiTokenService = validateApiTokenService; 
    } 

    public override bool AllowMultiple => true; 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
    } 
} 

ich wie so konfiguriert:

kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller); 

Mein Verständnis über die Informationen auf den obigen Link basiert ist, dass die ActionFilter sollte dann für alle Aktionen in allen WebAPI-Controllern ausgeführt werden. Ich habe jedoch Haltepunkte bei beiden überschriebenen Methoden im Filter gesetzt und es wird nie getroffen. Ich habe bei der Konfiguration einen Haltepunkt gesetzt und kann bestätigen, dass er ausgeführt wird.

Was fehlt mir? Ich brauche diesen ActionFilter, um auf allen Aktionen in jedem ApiController in meinem Projekt zu laufen.

+0

Wie werden Sie Injektion des Konstrukts zu konfigurieren oder Parameter für ApiAuthorizeFilter? – DavidS

+0

@DavidS das versuche ich zu lösen. Ich möchte, dass IValidateApiTokenService in meinen Filter eingefügt wird. –

+0

Ohne zu wissen, wie der IValidateApiTokenService instanziiert werden muss, kann ich keine spezifische Empfehlung geben, aber es gibt ein paar Beispiele dafür, wie man es im Beispielcode tut (wenn Sie noch nicht nachsehen): https: //github.com/ninject/Ninject.Web.WebApi/blob/master/src/SampleApplication/Controllers/FilterInjectionExample/FilterInjectionModule.cs – DavidS

Antwort

2

in Ihrer Startup-Klasse

public void Configuration(IAppBuilder app) 
{  
    var kernel = new StandardKernel(); 
    // register IValidateApiTokenService 
    var config = new HttpConfiguration(); 
    config.Filters.Add(new ApiAuthorizeFilter(kernel.Get<IValidateApiTokenService>()); 
} 
0

Ich habe nie an Ninject gearbeitet, ich arbeitete an Unity. Mit meiner Erfahrung in der Arbeit an Unity werde ich versuchen, etwas Licht in das Thema zu bringen.

Ich bin nicht sicher, was ist der Zweck der _validateApiTokenService, aber was ich kann, Beobachter aus dem obigen Code ist, dass Sie die Abhängigkeit der Umsetzung IValidateApiTokenService konfigurieren zu binden. Zusammen mit dem folgenden Code

kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller); 

können Sie etwas wie

kernel.Bind<IValidateApiTokenService>().To<ValidateApiTokenService>(); 

oder

kernel.Bind<IValidateApiTokenService>.To<ValidateApiTokenService>().InSingletonScope(); 

haben müssen, wenn sie in Singleton Rahmen sein soll.

+0

Vielen Dank für die Antwort. Meine Frage lautete jedoch speziell darauf, Ninjects DI mit ActionFilters zu arbeiten. Ich habe DI bereits richtig in Controllern arbeiten. –

1

Der Grund, warum es nicht funktioniert, ist, dass ActionFilters (oder irgendwelche Filter) als Singletons von der Laufzeit erstellt werden (eine Instanz für immer im App-Kontext) und generell hat jeder DI-Container Probleme beim Verdrahten die vorübergehenden und/oder wegwerfbaren Abhängigkeiten eines Objekts, wenn dieses Objekt ein Singleton ist.

Eine Lösung für Ihr Problem wäre die in Service-Locator wie so gebaut zu verwenden: DependencyResolver.Current.GetService(typeof(IValidateApiTokenService));

ich persönlich nicht Ninject für meine DI Bedürfnisse verwenden, aber wenn die oben nicht funktioniert es wahrscheinlich braucht einige Verdrahtung im DI-up Startup oder ein Integrationspaket wie diese verwendet: https://github.com/ninject/ninject.web.mvc/wiki/MVC3

Verwandte Themen