C# 如何以及在何处声明可在整个MVC/单页应用程序中访问的全局变量

C# 如何以及在何处声明可在整个MVC/单页应用程序中访问的全局变量,c#,asp.net-mvc,entity-framework,authentication,C#,Asp.net Mvc,Entity Framework,Authentication,我正在使用asp.NETMVC和EF。对于控制器中我的应用程序中的每个登录会话,我可以使用var userID=int.Parse(user.Identity.Name)获取登录者的用户ID但是,我也希望在其他存储库和服务类中使用它,这是一种最初在每个会话中获取此值并将其值存储在全局变量中的方法,解决方案中的每个类都可以访问该全局变量因为需要存储的数据是会话级别的,所以将数据存储在会话变量中。会话[“UserId”]=UserId。您可以从应用程序的任何位置访问该会话的用户ID。例如。var u

我正在使用asp.NETMVC和EF。对于控制器中我的应用程序中的每个登录会话,我可以使用
var userID=int.Parse(user.Identity.Name)获取登录者的用户ID但是,我也希望在其他存储库和服务类中使用它,这是一种最初在每个会话中获取此值并将其值存储在全局变量中的方法,解决方案中的每个类都可以访问该全局变量

因为需要存储的数据是会话级别的,所以将数据存储在会话变量中。会话[“UserId”]=UserId。您可以从应用程序的任何位置访问该会话的用户ID。例如。var userId=(int)Session[“userId”]

在MVC中,用户在
页面
请求的上下文中是已知的,但在其他(repository/service/BL/DAL)类中并非如此。他们没有,也不应该有任何关于MVC的知识

但是,通过为所有控制器创建基类,在那里实现一些方法和属性,并让实际的控制器从中继承,您可以简化工作。像这样:

MyBaseController.cs

public abstract class MyBaseController : Controller
{
    public int UserID
    {
        get { return int.Parse(User.Identity.Name); }
    }

    // other useful methods & properties...
}
public class MyController : MyBaseController
{
    public ActionResult Index()
    {
        var data = MyService.GetData(UserID);
        return View(data);
    }
}
MyController.cs

public abstract class MyBaseController : Controller
{
    public int UserID
    {
        get { return int.Parse(User.Identity.Name); }
    }

    // other useful methods & properties...
}
public class MyController : MyBaseController
{
    public ActionResult Index()
    {
        var data = MyService.GetData(UserID);
        return View(data);
    }
}

您不需要全局变量——因为只有一个全局变量,不同的用户会相互覆盖。我认为您应该始终将userId传递给存储库或服务类,而不是将其作为全局变量。