Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 5每个用户的全局变量_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# MVC 5每个用户的全局变量

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

我发现我所有的行为中都有很多重复的代码,我想知道避免这种情况的最佳方法。例如,假设每个登录的用户都属于一所学校,我几乎在每次操作中都需要访问该学校ID

它们就像我现在看到的那样,几乎每个操作都会重复访问数据库,并且需要引用我的userService类……类似于:

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