C# MVC 5每个用户的全局变量
我发现我所有的行为中都有很多重复的代码,我想知道避免这种情况的最佳方法。例如,假设每个登录的用户都属于一所学校,我几乎在每次操作中都需要访问该学校ID 它们就像我现在看到的那样,几乎每个操作都会重复访问数据库,并且需要引用我的userService类……类似于:C# MVC 5每个用户的全局变量,c#,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我发现我所有的行为中都有很多重复的代码,我想知道避免这种情况的最佳方法。例如,假设每个登录的用户都属于一所学校,我几乎在每次操作中都需要访问该学校ID 它们就像我现在看到的那样,几乎每个操作都会重复访问数据库,并且需要引用我的userService类……类似于: public ActionResult Index() { var schoolId = userService.GetSchoolId(User.Identity.GetUserId()); var textBooksForSchoo
public ActionResult Index()
{
var schoolId = userService.GetSchoolId(User.Identity.GetUserId());
var textBooksForSchool = textBookService.GetBooks(schoolId);
...
}
public ActionResult Delete()
{
var schoolId = userService.GetSchoolId(User.Identity.GetUserId());//all over the place
var textBooksForSchool = textBookService.DeleteBooks(schoolId);
...
}
我知道我可以将SchoolId添加到声明中,但是在每个方法中返回它的语法都非常详细(据我所知,这避免了每次访问声明时都会出现db命中?)
在GenerateIdentityAsync中:
var claims = new Collection<Claim>
{
new Claim("SchoolId", User.SchoolId.ToString())
};
userIdentity.AddClaims(claims);
这里有什么最佳实践吗?可能在登录时将声明存储在全局变量中?如何创建您自己的基本控制器,您的所有控制器都从中继承,并将SchoolId作为属性,然后创建一个ActionFilter,将每个控制器强制转换为该基本控制器,并在每个请求中设置该值?然后,它将在您的所有操作上可用,但您只需编写一次代码
它会激发每个请求,所以你可以考虑其他技术来最小化你必须查找值的次数,但是这个机制是解决你的代码复制问题的一种方法。
< P>这是我做的……/P> 基本控制器public class BaseController : Controller
{
public AppUser CurrentUser
{
get
{
return new AppUser(this.User as ClaimsPrincipal);
}
}
}
索赔本金
public class AppUser : ClaimsPrincipal
{
public AppUser(ClaimsPrincipal principal)
: base(principal)
{
}
public string Name
{
get
{
return this.FindFirst(ClaimTypes.Name).Value;
}
}
public string Email
{
get
{
return this.FindFirst(ClaimTypes.Email).Value;
}
}
}
在另一个控制器中,您只需执行以下操作即可访问声明类型
CurrentUser.Email
我非常喜欢扩展方法:
public static int SchoolId(this IPrincipal principal)
{
return Convert.ToInt32((principal as ClaimsPrincipal).Claims.First(x => x.Type == "SchoolId").Value);
}
行动:
var textBooksForSchool = textBookService.GetBooks(User.SchoolId());
您可以将详细代码移动到扩展方法。
var textBooksForSchool = textBookService.GetBooks(User.SchoolId());