2015-09-10 22 views
7

Sono confuso su come utilizzare il metodo CreatePerOwinContext OWIN. Per quanto posso vedere è un meccanismo di DI povero uomo. Eppure, non riesco a vedere come usarlo.Dovrebbe essere usato esattamente IAppBuilder.CreatePerOwinContext <T>?

Siamo in grado di registrare un tipo/attuazione alla sequenza di avvio come:

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

Allora come facciamo a risolvere a che in seguito. La documentazione dice che può essere recuperato tramite il metodo Get. Ma Get<T> si aspetta un parametro stringa, che è la chiave per quella voce nell'Identificzione di Enviornment? Come posso conoscere la chiave in questo caso?

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

risposta

3

È possibile utilizzare typeof per ottenere il parametro key:

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

Inoltre, Microsoft.AspNet.Identity.Owin assieme contiene la versione senza parametri di Get<T>() metodo, in modo da poter utilizzare se si dispone già di ASP.NET identità in il tuo progetto.

+1

Questa risposta mi ha indirizzato nella giusta direzione. Tuttavia, se vuoi prendere l'oggetto con la chiave, dobbiamo prefissare AssemblyQualifiedName con 'AspNet.Identity.Owin:', dando solo il nome di tipo completo non funzionerà – BuddhiP

+1

Non penso che funzioni. Ho controllato le chiavi di proprietà ctx.Environment e sembra che la chiave aggiunta sia un nome di assembly completo cambiando in typeof (ApplicationDbContext). AssemblyQualifiedName. Mi piace come la documentazione di owin non menzioni nulla di tutto ciò. – enorl76

2

ho una risposta più corretta dopo l'esecuzione in questo me stesso, cercando di implementare il codice all'interno di questo StackOverflow risposta: https://stackoverflow.com/a/31918218

Quindi, dato queste codice di inizializzazione all'interno del metodo di configurazione convenzionale:

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 può recuperare l'istanza creata da questo codice:

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. 
} 
Problemi correlati