c# - 静态变量只存在于当前执行页面的上下文中?

标签 c# asp.net static scope

根据我网站的设置方式,我有一个母版页、页面以及该页面内的控件,所有这些都可以显示有关查看用户的信息。

因为我多次需要此信息,所以我必须创建模型的实例,然后每次需要从他们的帐户读取数据时返回 User 对象。

为了解决这个问题,我做了以下操作:

public static class Core
{
    private static PatientRow Patient;
    public static PatientRow GetCurrentPatient()
    {
        if (Patient == null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.IsInRole("Patient"))
        {
            using (PatientModel model = new PatientModel())
            {
                Patient = model.Find<PatientRow>(User.CurrentUser.UserID);
            }
        }
        return Patient;
    }
}

如您所见,我检查私有(private)静态变量 Patient 是否为 null,如果是,则离开并获取它。下次我调用 GetCurrentPatient 时,由于患者已经填充,我刚刚为自己保存了数据库调用等。

现在问题来了...众所周知,这意味着每次我调用 GetCurrentPatient 时,无论谁正在查看该网站,他们都会获得最后(或第一个)设置的值。

我不想在 session 中存储对象,这很顽皮,但我确实需要找到一种方法来将静态范围限制为用户 session ,或者合理的妥协,将其限制为当前页面的执行。

有什么建议吗?

干杯

编辑:在阅读达林的回答之前,我已经实现了以下内容。

我拥有的每个页面都继承一个 BasePage 类(以便更轻松地处理菜单等)。由于存储在此处的任何代码仅在执行期间可用(静态变量除外),因此我只是创建了一个注册表字典集合,然后从我的原始 GetCurrentPatient 中检查注册表是否包含该对象,如果包含,则返回它,如果没有拿到,就存储起来,最后返回。

我将更改我当前的代码以匹配 Darin 的代码。非常感谢达林!

最佳答案

您可以将其存储在 HttpContext.Current.Items 包中。它将在 HTTP 请求的整个执行过程中可用,并且显然仅限于当前用户。因此,如果您在同一请求中从多个位置多次调用 GetCurrentPatient 方法,它将仅访问数据库一次。如果您需要保留此信息超过一个请求,则需要使用 session 。

例如:

public static class Core
{
    public static PatientRow GetCurrentPatient()
    {
        var patient = HttpContext.Current.Items["patient"];
        if (patient == null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.IsInRole("Patient"))
        {
            using (PatientModel model = new PatientModel())
            {
                patient = model.Find<PatientRow>(User.CurrentUser.UserID);
                HttpContext.Current.Items["patient"] = patient;
            }
        }
        return patient;
    }
}

不要在静态字段中存储任何内容,尤其是当此信息仅与当前用户相关时。

关于c# - 静态变量只存在于当前执行页面的上下文中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7213005/

相关文章:

c# - 在 C# 中,静态构造函数是为对象的每个初始化运行还是只运行一次?

c# - 防止在 ASP.NET 中回发时关闭 Bootstrap 模式

c# - 来自 sql 的 Lambda 表达式

PHP 静态属性和 const 覆盖

c# - 2 列范围之间的 Linq 值

c# - ASP.NET 和 jQuery 日历 - 不起作用

.Net:静态类和多线程?

c# - 在 C# 中以编程方式启用 Excel 宏

c# - 使用 C# 和 HTTPrequest 登录网站

c# - 在 C# 中恶意使用 Maybe monad 和扩展方法?