应该如何使用IAppBuilder.CreatePerOwinContext ?

我对如何使用OWIN CreatePerOwinContext方法感到困惑。 据我所知,这是一个糟糕的勒芒机制。 然而,我没有看到如何使用它。

我们可以在Startup序列中注册一个类型/实现,如:

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

然后我们如何在以后解决这个问题。 文档说它可以通过Get方法检索。 但Get需要一个字符串参数,这是Enviornment IDictionary中该条目的关键? 在这种情况下,我怎么知道钥匙?

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

您可以使用typeof获取key参数:

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

此外, Microsoft.AspNet.Identity.Owin程序集包含无参数版本的Get()方法,因此如果项目中已有ASP.NET标识,则可以使用它。

在遇到这个问题之后,我有一个更正确的答案,试图在这个stackoverflow答案中实现代码: https : //stackoverflow.com/a/31918218

因此,在传统的Configure方法中给出了这个初始化代码:

 static void Configuration(IAppBuilder app) { //https://stackoverflow.com/a/31918218 app.CreatePerOwinContext(() => new AppBuilderProvider(app)); ConfigureAuth(app); //note implementation for this is typically in separate partial class file ~/App_Start/Startup.Auth.cs } 

可以检索此代码创建的实例:

 public ActionResult SomeAction() { //https://stackoverflow.com/a/31918218 var app = HttpContext.GetOwinContext().Get("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. }