在类库中实例化Identity ApplicationUserManager

时间:2017-03-02 13:02:17

标签: c# asp.net-identity-2 asp.net-mvc-5

我不喜欢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?

2 个答案:

答案 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())))
        {

        }
    }