2014-12-17 10 views
12

Ich versuche, SimpleInjector mit OWIN in einem WebAPI-Projekt zu verwenden. Allerdings schlägt die folgende Zeile in ConfigureAuthWebApi + Einfacher Injektor + OWIN

app.CreatePerOwinContext(container.GetInstance<ApplicationUserManager>); 

Die Ausnahme ist Die ApplicationUserManager registriert wird als ‚Web-API-Request‘ Lebensstil, aber die Instanz außerhalb des Kontexts einer Web-API anfordern angefordert.

Ich verwende container.RegisterWebApiRequest<ApplicationUserManager>(); in Container-Initialisierung. (Es wird keine Ausnahmen geben, wenn ich Register statt RegisterWebApiRequest verwenden, aber dies ist nicht die bevorzugte Methode gemäß simple injector docs)

Wie ich verstehe, ApplicationUserManager Bedürfnisse registriert wird mit CreatePerOwinContext für OWIN richtig zu arbeiten. Ich frage mich, wie wir dies unter Verwendung von Simple Injector tun, da Simple Injector beim Start keine Instanzen auflösen kann.

Ich habe bereits die Methode in this SO answer versucht, aber es schlägt mit der gleichen Nachricht fehl.

Irgendeine Idee, wie kann ich das auflösen?

Antwort

12

Ich habe den folgenden Code verwendet, um dieses Problem zu lösen.

public static void UseOwinContextInjector(this IAppBuilder app, Container container) 
{ 
// Create an OWIN middleware to create an execution context scope 
app.Use(async (context, next) => 
{ 
    using (var scope = container.BeginExecutionContextScope()) 
    { 
     await next.Invoke(); 
    } 
}); 
} 

und rief dann app.UseOwinContextInjector(container); direkt nach der Registrierung Abhängigkeiten.

Dank this post

+4

Haben Sie das ganze Beispiel irgendwo zu sehen, versuche ich etwas sehr ähnliches zu tun, aber ich benutze auch IdentityServer3, ein Handler ein Attribut für die Versionierung. – OutOFTouch

+0

Können Sie ein vollständiges Beispiel für Owin + MVC + SimpleInjector bereitstellen? – Jerome2606

2

Sie können this question nützlich finden. Die Idee besteht darin, die Verwendung von OWIN zum Auflösen von Abhängigkeiten zu vermeiden, da dadurch der Controller-Code etwas unübersichtlich wird. Der folgende Code, der OWIN verwendet UserManager Instanz zu lösen, ist ein Service Locator anti-pattern:

public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();     
    } 
    set 
    { 
     _userManager = value; 
    } 
} 

Statt auf OWIN zu verlassen, um Abhängigkeiten aufzulösen, erforderlichen Dienste in Ihrem Controller Konstruktor zu injizieren und IDependencyResolver Controller für Sie zu bauen zu verwenden. This article zeigt, wie die Abhängigkeitsinjektion in der ASP.NET-Web-API verwendet wird.

+1

Danke. Ich verwende OWIN nicht, um Abhängigkeiten aufzulösen. OWIN verwendet intern ApplicationUserManager und versucht, dieses von OwinContext abzurufen. OWIN auf die ApplicationUserManager-Instanz aufmerksam zu machen ist für OWIN zwingend erforderlich (bitte korrigieren Sie mich, wenn ich falsch liege). Ich verwende nicht den Code, den Sie im AccountController angegeben haben. AccountController ruft ApplicationUserManager über die Konstruktorinjektion ab. Also bleibt das Problem bestehen. – su8898

+1

@ su8898 dann könnte ich Ihnen empfehlen, sich [diesen Blogbeitrag] anzuschauen (http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/) - vielleicht Sie ' Ich werde dort einige nützliche Codebeispiele finden. –

+0

Die Beispiele im Blogbeitrag verwenden 'app.CreatePerOwinContext (() => DependencyResolver.Current.GetService ());' in _ConfigureAuth_, weil es sich um ein MVC-Projekt handelt. WebAPI hat eine andere Implementierung für den DependancyResolver. Selbst wenn wir eine Methode wie diese verwenden, denke ich, dass es scheitern würde, weil SimpleInjector 'ApplicationUserManager' in _ConfigureAuth_ nicht auflösen kann. Ich frage mich, wie ich dieses Problem umgehen soll! – su8898