2017-03-02 33 views
1

我不喜欢Identity的一件事情是UserManagers必须在控制器中实例化,您希望获取用户信息。在我的项目中,我将所有的业务逻辑转移到DAL类库中,并希望Identity也能在那里。在类库中实例化Identity ApplicationUserManager

我已经感动了所有的标识类到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?

回答

3

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

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

可能可以初始化它在你的类库,如果你可以用ApplicationDbContext(DataContext的,你的情况)实例,它正在从检索OwinContext

提供它例如

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

,你也可能会找到一些替代实例像UserValidatorPasswordValidator ApplicationUserManager类属性

我希望这可以给你一些想法进行!

+0

这是完美的。正是我需要的!谢谢! – JoeyD

+0

很高兴听到这一点。 *请考虑标记答案,如果它解决您的问题* –

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

     } 
    }