如何在没有全局变量的情况下始终保留变量?

时间:2012-07-28 15:54:46

标签: c# asp.net optimization

我有两个GridView。我有方法GetGeneralDiagnosis,它返回所有诊断的列表:

代码诊断
F50饮食失调
F51非器质性睡眠障碍

和方法GetSpecificDiagnosis返回更具体的列表:

代码诊断
F50.0神经性厌食症 F50.1非典型神经性厌食症 F51.0无机失眠
F51.1非器质性睡眠亢进

现在我已经有了根据第一个GridView的一般诊断将SPECIFIC DIAGNOSIS绑定到第二个GridView的方法。

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e)
{
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Code"].ToString(); 
    var ICD10 = Visit.GetSpecificDiagnosis();   // here I'm getting data from database
    gvSpecificDiagnosis.DataSource = ICD10.Where(i => i.ICD10Code.Contains(generalDiagnosis)).Select(i => new { i.ICD10Name, i.ICD10Code });
    gvSpecificDiagnosis.DataBind();
}

每次更改选定的索引时,我都不想连接到数据库。

如何才能获得我的列表var ICD10 = Visit.GetSpecificDiagnosis()一次?我听说全局变量是个坏主意,所以我怎么能用另一种方式呢?

3 个答案:

答案 0 :(得分:1)

您可以让Visit类缓存返回的数据。

当调用GetSpecificDiagnosis时,它将检查是否已从数据库中检索到此数据,如果是,则返回该数据。如果不是,它将从数据库中检索它并将其保存到缓存中。

您应该注意的一件事是这些数据是否是静态的(即在整个应用程序的生命周期内永远不会改变),还是动态的。在第一种情况下,您不必进行任何特殊处理,但如果是后者,则必须使数据库中的信息发生变化,使缓存无效。

我建议您have a look here查看如何开始使用ASP.NET中的缓存。

答案 1 :(得分:1)

您可以使用私有成员变量。只要包含它的阶级存在,这个人就“活着”。用一个属性包装它来访问它,并在必要时自动从数据库中读取它。

private TypeOfICD10 _icd10;
private TypeOfICD10 ICD10
{
    get
    {
        if (_icd10 == null) { // Get from database.
            _icd10 = Visit.GetSpecificDiagnosis();   
        }
        return _icd10;
    }
}

现在你可以像这样使用它,它只会在第一次调用时从数据库中读取

protected void gvGeneralDiagnosis_SelectedIndexChanged(object sender, EventArgs e)
{
    string generalDiagnosis = gvGeneralDiagnosis.DataKeys[gvGeneralDiagnosis.SelectedIndex].Values["ICD10Name"].ToString();
    gvSpecificDiagnosis.DataSource = ICD10
        .Where(i => i.ICD10Code.Contains(generalDiagnosis))
        .Select(i => new { i.ICD10Name, i.ICD10Code });
    gvSpecificDiagnosis.DataBind();
}

答案 2 :(得分:0)

我对你的问题中的Visist类知之甚少,但为什么不以这种方式缓存ICD10你将使用缓存对象,只有当Cache Key ICD10的值为null时才会进行数据库调用

示例:

if(Cache["ICD10"] == null)
{
 var ICD10 = Visit.GetSpecificDiagnosis();
 Cache["ICD10"] = ICD10;
}
else
{
var ICD10 =  Cache["ICD10"];
}