在类库中实例化 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 类属性,例如 UserValidator、PasswordValidator 等。
我希望这能给你一些继续前进的想法!
【讨论】:
这是完美的。正是我需要的!谢谢! 很高兴听到这个消息。 如果它解决了您的问题,请考虑标记答案【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章