在 Class 库中实例化身份 ApplicationUserManager

Instantiate Identity ApplicationUserManager in Class Library

我不喜欢 Identity 的一件事是 UserManagers 必须在您希望为其获取用户信息的控制器中实例化。在我的项目中,我将所有业务逻辑移到了 DAL class 库中,并希望身份也在那里。

我已经将所有身份 classes 移动到 DAL class 库中(ApplicationRole、ApplicationUser、ApplicationRoleManager、ApplicationSignInManager、ApplicationUserManager、EmailSerivce、SmsService)

我的 DataContext 继承自 IdentityDBContext

public class DataContext : IdentityDbContext<ApplicationUser>
{
    public DataContext()
        : base("DefaultConnection", throwIfV1Schema: false) 
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    public static DataContext Create()
    {
        return new DataContext();
    }

    static DataContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, DataContextMigrationsConfiguration>());   
    }

所以我可以通过数据库上下文访问用户和角色

internal class UserRepository
{
    internal ApplicationUser GetUserById(string id)
    {
        using(var db = new DataContext())
        {
            return db.Users.Where(a => a.Id == id).FirstOrDefault();

        }
    }
}

问题是我无权访问 ApplicationUserManager 公开的方法。我正在尝试从我的用户存储库中访问 ApplicationUserManager,但不知道如何实例化 ApplciationUserManager class。

在controller中,实例化如下

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

但是,在 DAL class 库的存储库中,我无法访问 OwinContext 来获取用户管理器。

如何从 Class 库中访问 ApplicationUserManager?

Visual studio 的默认 MVC 模板使用以下代码创建 ApplicationUserManager 实例。

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

如果您可以为它提供 ApplicationDbContext(在您的情况下为 DataContext) 实例,它可能会在您的 class 库中实例化,该实例是从OwinContext

例如

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new DataContext()));

而且您可能必须找到一些替代方法来实例化 ApplicationUserManager class 属性,例如 UserValidator密码验证器

我希望这能给你一些继续下去的想法!

感谢 Sivaram K,这就是我能够访问应用程序管理器的方式。

internal ApplicationUser GetUserById(string id)
    {
        using(var db = new DataContext())
        {
            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));

        }

        using(var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new DataContext())))
        {

        }
    }