依赖于其他实例变量的实例变量



我想知道设置类变量的正确方法,该类变量将在类中的大多数/所有方法中使用,该类变量依赖于正在使用的其他类变量和属性。

我不相信我能够将其放入构造函数中,因为它所依赖的设置属性和变量直到构造函数执行后才设置。

我正在使用 asp.net 身份。

要设置的变量:

private bool userIsSysAdmin;

userIsSysAdmin将由以下因素决定:

userIsSysAdmin = UserManager.GetRoles(user.Id)
      .Any(u => u == "Sys Admin");

请注意userUserManager的使用

类签名、属性和实例变量:

    public class CompanyController : Controller 
    {
       public CompanyController()
       {
       }
       public CompanyController(ApplicationUserManager userManager, ApplicationRoleManager roleManager)
       {
           UserManager = userManager;
           RoleManager = roleManager;
       }
       private ApplicationUserManager _userManager;
       public ApplicationUserManager UserManager
       {
           get
           {
               return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
           }
           private set
           {
               _userManager = value;
           }
       }
       ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext()
           .GetUserManager<ApplicationUserManager>()                               
           .FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

由于控制器的几乎每个方法都需要它,因此这是类的自然依赖关系。

在这种情况下,可以在控制器的构造函数中计算它。但是,在实际需要UserUserIsSysAdmin属性之前,您不希望查询数据库。

因此,您可以使用Lazy<T>来解决此问题:

public class CompanyController : Controller 
{
    private readonly Lazy<ApplicationUser> user;
    private readonly Lazy<bool> userIsSysAdmin;
    //Not sure why you need parameterless this constructor?
    public CompanyController()
    {
        this.user = new Lazy<ApplicationUser>(() => UserManager.FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()));
        this.userIsSysAdmin = new Lazy<bool>(() => UserManager.GetRoles(User.Id).Any(u => u == "Sys Admin"));
    }
    public CompanyController(ApplicationUserManager userManager, ApplicationRoleManager roleManager)
    {
        UserManager = userManager;
        RoleManager = roleManager;
        this.user = new Lazy<ApplicationUser>(() => UserManager.FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()));
        this.userIsSysAdmin = new Lazy<bool>(() => UserManager.GetRoles(User.Id).Any(u => u == "Sys Admin"));
    }
    public ApplicationUser User
    {
        get { return this.user.Value; }
    }
    public bool UserIsSysAdmin
    {
        get { return this.userIsSysAdmin.Value; }
    }
    private ApplicationUserManager _userManager;
    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }
}

UserUserIsSysAdmin属性的访问修饰符应根据您的特定逻辑和用例进行设置。

您可以使用延迟加载的属性。这意味着您将值保留为未初始化状态,直到第一次需要它。您还可以在设置新的用户管理器时重置 user 的值。这样,您可以确保用户始终与用户管理器匹配。

   public ApplicationUserManager UserManager
   {
       get
       {
           return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
       }
       private set
       {
           _userManager = value;
           _user = null;
       }
   }
   ApplicationUser _user;
   private ApplicationUser User
   {
       get
       {
           if (_user == null)
           {
               _user = System.Web.HttpContext.Current.GetOwinContext()
                   .GetUserManager<ApplicationUserManager>()                               
                   .FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
           }
           return _user;
       }
   }

相关内容

  • 没有找到相关文章

最新更新