1

我有这段代码——

public class UserManager : UserManager<ApplicationUser>
{
    private ApplicationDbContext _dbAccess;
    public UserManager() : 
         base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        this.UserValidator = new CustomUserValidator<ApplicationUser>(this);
        var provider = new MachineKeyProtectionProvider();
        this.UserTokenProvider = 
                 new DataProtectorTokenProvider<ApplicationUser>(
                            provider.Create("SomeCoolAuthentication"));

       //DO I REALLY NEED TO DO THIS AGAIN?
       this._dbAccess = new ApplicationDBContext(); 
    }

    public bool myOwnHelperMethod(){
        //is there a way to use the ApplicationDbContext instance that 
        //was initialized in the base constructor here? 
        //Or do i have to create a new instance?
    }
}

有没有更好的方法来编写它,以便我可以实例化 ApplicationDBContext,使用它来调用基本构造函数,然后稍后在一些辅助方法中使用相同的实例?或者我是否必须在构造函数中创建另一个实例以在辅助方法中使用。

4

2 回答 2

4

将此属性添加到您的UserManager课程中:

 private ApplicationDbContext Context
 {
      get { return ((UserStore<ApplicationUser>)this.Store).Context as ApplicationDbContext; }
 }

该类UserManager公开了一个Store属性。由于您知道内部使用的对象的类型,因此您只需转换它们并Context在代码中使用该属性。

于 2017-09-28T20:39:15.177 回答
1

你有几个选择。

第一种是使用依赖注入。使用这种方法,您将删除ApplicationDbContextto 外部的创建UserManager并通过构造函数将其传入。例如:

public class UserManager : UserManager<ApplicationUser>
{
    private ApplicationDbContext _dbAccess;

    public UserManager(ApplicationDbContext dbAccess) : 
         base(new UserStore<ApplicationUser>(dbAccess))
    {
        ...

        this._dbAccess = dbAccess; 
    }

    ...
}

@Juan 在他的回答中提供了我刚要建议的第二个选项,所以我不会在这里重复。

于 2017-09-28T20:41:21.147 回答