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>(???);
您可以使用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.
}