我不喜欢Identity的一个原因是UserManagers必须在你希望获取用户信息的控制器中实例化。在我的项目中,我将所有业务逻辑移动到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>());
}
所以我可以通过DB上下文访问用户和角色
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?
答案 0 :(得分:4)
Visual Studio的默认MVC模板使用以下代码创建 ApplicationUserManager 实例。
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
如果可以在 OwinContext <中提取 ApplicationDbContext(在您的情况下为DataContext)实例,则可以在类库中对其进行实例化。 / p>
e.g。
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new DataContext()));
并且您可能还必须找到一些替代方法来实例化 ApplicationUserManager 类属性,例如 UserValidator , PasswordValidator 等。
我希望这可以让你有一些想法继续下去!
答案 1 :(得分:3)
感谢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())))
{
}
}