asp.net-web-api - .net core 2.1 中 CreatePerOwinContext 的替代方法是什么
问题描述
我有一个 webapi,我在 startup.cs 文件中使用 app.CreatePerOwinContext,但我想将该 webapi 迁移到 .net core 2.1。所以我一直坚持这一点,因为我无法为 CreatePerOwinContext 提供任何替代方案。
这是我的 webapi 代码:
public static UserManager<IdentityUser> Create(IdentityFactoryOptions<UserManager<IdentityUser>> options, IOwinContext context)
{
var manager = new UserManager<IdentityUser>(new UserStore());
return manager;
}
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext<UserManager<IdentityUser>>(Create);
...
}
那么如何在 .net core 2.1 中转换上述代码呢?
解决方案
该方法用作服务定位器来加载依赖项,然后在整个代码中访问它们。服务位置本身被认为是一种反模式,不建议在绝大多数现实世界情况下使用。
相反,人们现在使用IOC 容器来管理他们的依赖注入。在 ASP.NET MVC Core 中,现在为您提供了一个轻量级且“足够好”的 IOC 容器,作为框架的一部分。
Microsoft在本文中提供了概述,但简短的版本是在您的 Startup.cs 中,您在 ConfigureServices 下注册您的依赖关系树(通常使用扩展方法,因此 Startup.cs 不会变得太大)。
注册依赖项后,您可以通过属性注入、构造函数注入或方法参数注入来加载它们。这会产生比标准服务位置更易于维护的更简洁的代码。
编辑:
如果您真的坚持管理服务定位器是因为技术债务是可以接受的,或者是因为业务案例需要当前设计,那么我建议您将工作从 OwinContext 转移到 HttpContext。
在 ASP.NET Core 中,您可以通过将 HttpContextAccessor 注入到您的类中来访问 HttpContext,并将 OwinContext 调用更改为从 HttpContext 中的键值存储中提取。
可以在这个 SO answer中找到注入 HttpContextAccessor 的说明。只需使用HttpContext.Current.Application["myObject"]
.
我不建议这样做,但我愿意分享它,因为我了解最后期限的现实与架构的理想主义。
推荐阅读
- python - 通过 Flask 提供动态 PDF,由 pdfrw 生成
- pandas - 基于条件熊猫的子集数据框
- r - 在 R 中创建具有最小预测误差的 ARIMA 模型
- javascript - 是否可以避免将参数隐式传递给子组件?
- database - 在本地数据库中镜像部分 redux 状态
- postgresql - 如何在 PostgreSQL 中设置带有日期和时间的两列之间的间隔?
- javascript - 单击按钮时未发送 Django Post 请求?
- javascript - Django 在模板中错误地将 float x.xx 转换为 x,xx
- javascript - 如何禁用指针事件,但允许拖动
- c# - Web API 更新的令牌认证