首页 > 解决方案 > .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 中转换上述代码呢?

标签: asp.net-web-apiasp.net-coreoauth-2.0owinasp.net-core-2.0

解决方案


该方法用作服务定位器来加载依赖项,然后在整个代码中访问它们。服务位置本身被认为是一种反模式,不建议在绝大多数现实世界情况下使用。

相反,人们现在使用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"].

我不建议这样做,但我愿意分享它,因为我了解最后期限的现实与架构的理想主义。


推荐阅读