IAppBuilder.CreatePerOwinContext应该使用

本文关键字:CreatePerOwinContext IAppBuilder | 更新日期: 2023-09-27 18:12:01

我对如何使用OWIN CreatePerOwinContext方法感到困惑。在我看来,这是一个穷人的DI机制。然而,我不知道如何使用它。

我们可以像这样在Startup序列中注册一个类型/实现:
app.CreatePerOwinContext<IUserService>(() => {
     return new UserService() as IUserService;
});

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

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

IAppBuilder.CreatePerOwinContext<T>应该使用

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

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

此外,Microsoft.AspNet.Identity.Owin汇编包含Get<T>()方法的无参数版本,因此如果您已经有ASP,则可以使用它。

我有一个更正确的答案后运行到这个自己,试图实现这个stackoverflow答案内的代码:https://stackoverflow.com/a/31918218

那么在常规的Configure方法中给出这个初始化代码:

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
}

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

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.
}
相关文章:
  • 没有找到相关文章