我想知道设置类变量的正确方法,该类变量将在类中的大多数/所有方法中使用,该类变量依赖于正在使用的其他类变量和属性。
我不相信我能够将其放入构造函数中,因为它所依赖的设置属性和变量直到构造函数执行后才设置。
我正在使用 asp.net 身份。
要设置的变量:
private bool userIsSysAdmin;
userIsSysAdmin
将由以下因素决定:
userIsSysAdmin = UserManager.GetRoles(user.Id)
.Any(u => u == "Sys Admin");
请注意user
和UserManager
的使用
类签名、属性和实例变量:
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());
由于控制器的几乎每个方法都需要它,因此这是类的自然依赖关系。
在这种情况下,可以在控制器的构造函数中计算它。但是,在实际需要User
或UserIsSysAdmin
属性之前,您不希望查询数据库。
因此,您可以使用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;
}
}
}
User
和UserIsSysAdmin
属性的访问修饰符应根据您的特定逻辑和用例进行设置。
您可以使用延迟加载的属性。这意味着您将值保留为未初始化状态,直到第一次需要它。您还可以在设置新的用户管理器时重置 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;
}
}