C# ASP.Net网页中的强类型全局数据

C# ASP.Net网页中的强类型全局数据,c#,asp.net,webmatrix,asp.net-webpages,C#,Asp.net,Webmatrix,Asp.net Webpages,在ASP.Net网页中存储强类型全局数据的最佳实践是什么,每个请求都是唯一的?基本上我需要WebPageContext.Current.PageData,但需要强类型 直到现在,我才想出了这样的办法: public sealed class GlobalData { public static GlobalData Current { get { if (WebPageContext.Current.PageData["Gl

在ASP.Net网页中存储强类型全局数据的最佳实践是什么,每个请求都是唯一的?基本上我需要
WebPageContext.Current.PageData
,但需要强类型

直到现在,我才想出了这样的办法:

public sealed class GlobalData
{
    public static GlobalData Current
    {
        get
        {
            if (WebPageContext.Current.PageData["GlobalData"] == null
                || WebPageContext.Current.PageData["GlobalData"].GetType() != typeof(GlobalData))
            {
                WebPageContext.Current.PageData["GlobalData"] = new GlobalData();
            }
            return WebPageContext.Current.PageData["GlobalData"];
        }
    }

    public string SomeData { get; set; }
}

这样,我就可以在每页上使用
GlobalData.Current.SomeData
访问我的数据。还是有更好的解决方案?

这是一个很好的方法。我会简化一点:

public sealed class GlobalData
{
    public static GlobalData Current
    {
        get
        {
            // soft cast using "as" which will return null if the type is not correct
            var globalData = WebPageContext.Current.PageData["GlobalData"] as GlobalData;
            if (globalData == null)
            {
                // Need to instantiate
                globalData = new GlobalData();
                WebPageContext.Current.PageData["GlobalData"] = globalData;
            }

            return globalData;
        }
    }

    public string SomeData { get; set; }
}

谢谢你的意见!既然我想让事情简单明了,你认为有没有办法摆脱这个静态的
当前的
属性?我希望只使用
GlobalData.SomeData
访问我的数据。这可能适用于静态构造函数,但不会为每个请求创建新的GlobalData,对吗?不能将GlobalData设置为静态,因为这样所有用户都将共享一个副本。因为您希望每个用户都有一个副本,所以staticcurrent属性实际上实现了一个准单例,即每个请求一个副本。如果我是你,我唯一要做的更改就是使用HttpContext.Current.Items,这是一个在请求生命周期中存在的“缓存”,如果您可以使用它的话。感谢您提供有关“as”操作符的提示,在可能存在空值时,这对于保持代码干净非常有用。