在类库中实例化 Identity ApplicationUserManager

Posted

技术标签:

【中文标题】在类库中实例化 Identity ApplicationUserManager【英文标题】:Instantiate Identity ApplicationUserManager in Class Library 【发布时间】:2017-07-22 05:28:44 【问题描述】:

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

我已经将所有身份类移入 DAL 类库(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 类。

在控制器中,其实例化如下

    private ApplicationUserManager _userManager;

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

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

如何从类库中访问 ApplicationUserManager?

【问题讨论】:

【参考方案1】:

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

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

如果您可以为它提供从 OwinContext

例如

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

您可能还需要找到一些替代方法来实例化 ApplicationUserManager 类属性,例如 UserValidatorPasswordValidator 等。

我希望这能给你一些继续前进的想法!

【讨论】:

这是完美的。正是我需要的!谢谢! 很高兴听到这个消息。 如果它解决了您的问题,请考虑标记答案【参考方案2】:

感谢 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())))
        

        
    

【讨论】:

以上是关于在类库中实例化 Identity ApplicationUserManager的主要内容,如果未能解决你的问题,请参考以下文章

在类库中添加 System.Web.Script 引用

在类库中使用 API 接口,在 API 接口中使用类库? [关闭]

如何在类库中使用重定向(url)方法?

在类库中使用 WCF 服务时出错

无法在类库中为实体框架启用迁移

Session在类库中的使用