gpt4 book ai didi

c# - 依赖于其他实例变量的实例变量

转载 作者:行者123 更新时间:2023-11-30 23:14:39 25 4
gpt4 key购买 nike

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

我不相信我能把它放在构造函数中,因为它依赖于设置的属性和变量直到构造函数执行后才被设置。

我正在使用 asp.net Identity。

要设置的变量:

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

最佳答案

因为您几乎在 Controller 的每个方法中都需要它,所以这是您的类的自然依赖性。

在那种情况下,它可以在 Controller 的构造函数中计算。但是,您不想在实际需要 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应根据您的特定逻辑和用例设置属性。

关于c# - 依赖于其他实例变量的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42968358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com