在 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())))
{
}
}
我不喜欢 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())))
{
}
}