在调用基本构造函数和辅助方法时使用 class 属性

Using a class property while calling the base constructor and in helper methods

我有这段代码 --

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,使用它来调用基本构造函数,然后稍后在某些辅助方法中使用相同的实例?或者我是否必须在构造函数中创建另一个实例以用于辅助方法。

将此 属性 添加到您的 UserManager class:

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

UserManager class 暴露了 Store 属性。由于您知道内部使用的对象类型,因此您可以转换它们并在代码中使用 Context 属性。

你有几个选择。

第一个是使用依赖注入。使用这种方法,您可以将 ApplicationDbContext 的创建移除到 UserManager 之外,并通过构造函数将其传入。例如:

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

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

        this._dbAccess = dbAccess; 
    }

    ...
}

我刚才建议的第二个选项已经由@Juan在他的回答中提供,所以我不再重复。