2015-09-10 3 views
7

Ich bin verwirrt, wie die OWIN CreatePerOwinContext-Methode verwendet werden soll. Soweit ich sehen kann, ist es ein armer Mans-DI-Mechanismus. Aber ich verstehe nicht, wie ich es benutzen soll.Wie genau sollte IAppBuilder.CreatePerOwinContext <T> verwendet werden?

Wir können eine Art/Implementierung bei der Sequenz Startup registrieren wie:

app.CreatePerOwinContext<IUserService>(() => { 
    return new UserService() as IUserService; 
}); 

Dann, wie wir später zu, dass lösen. Die Dokumentation besagt, dass sie über die Get-Methode abgerufen werden kann. Aber Get<T> erwartet einen String-Parameter, der der Schlüssel zu diesem Eintrag in der Enviornment IDictionary ist? Wie kann ich den Schlüssel in diesem Fall wissen?

IUserService userService = context.Get<IUserService>(???); 

Antwort

3

Sie typeof verwenden können die key Parameter zu erhalten:

HttpContext.GetOwinContext().Get<ApplicationDbContext>(typeof(ApplicationDbContext).ToString()); 

Auch enthält Microsoft.AspNet.Identity.Owin Montage die parameterlos Version von Get<T>() Methode, so dass Sie es, wenn Sie bereits haben ASP.NET Identität verwenden können, in dein Projekt.

+1

Diese Antwort hat mich in die richtige Richtung geleitet. Wenn Sie jedoch das Element mit dem Schlüssel übernehmen möchten, müssen wir dem AssemblyQualifiedName mit 'AspNet.Identity.Owin:' vorangestellt werden, wodurch nur der vollständig qualifizierte Typname nicht funktioniert. – BuddhiP

+1

Ich glaube nicht, dass das funktioniert. Ich habe die ctx.Environment-Eigenschaftsschlüssel untersucht, und es scheint, dass der hinzugefügte Schlüssel ein vollständig qualifizierter Assemblyname ist, indem ich in typeof (ApplicationDbContext) .AssemblyQualifiedName umschalte. Ich liebe es, wie das in der Dokumentierung nicht erwähnt wird. – enorl76

2

Ich habe eine richtige Antwort auf mich selbst in dieser ausgeführt wird, versucht, den Code innerhalb dieser Stackoverflow Antwort zu implementieren: https://stackoverflow.com/a/31918218

So gegeben diese Initialisierung Code innerhalb der herkömmlichen Configure-Methode:

static void Configuration(IAppBuilder app) 
{ 
    //https://stackoverflow.com/a/31918218 
    app.CreatePerOwinContext<AppBuilderProvider>(() => new AppBuilderProvider(app)); 

    ConfigureAuth(app); //note implementation for this is typically in separate partial class file ~/App_Start/Startup.Auth.cs 
} 

One kann die durch diesen Code erstellte Instanz abrufen:

public ActionResult SomeAction() 
{ 
    //https://stackoverflow.com/a/31918218 
    var app = HttpContext.GetOwinContext().Get<AppBuilderProvider>("AspNet.Identity.Owin:" + typeof(AppBuilderProvider).AssemblyQualifiedName).Get(); 
    var protector = Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CreateDataProtector(app, typeof(Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1"); 
    var tdf = new Microsoft.Owin.Security.DataHandler.TicketDataFormat(protector); 
    var ticket = new AuthenticationTicket(ci, null); 
    var accessToken = tdf.Protect(ticket); 

    //you now have an access token that can be used. 
} 
Verwandte Themen