多个用户控件之间如何共享数据?

3
我有3个用户控件,每个控件都需要根据不同的URL参数从XML源中提取数据。由于它们都发送相同的请求,因此XML源中的数据对于所有3个用户控件来说是相同的。
对于相同的数据,进行3个独立的请求似乎很愚蠢。
我的想法是创建一个单例,我将调用该单例,该单例将对XML服务进行一次请求,然后向用户控件呈现漂亮的解析结果。
例如:
1. 用户控件A获取单例。 2. 用户控件A请求单例进行请求... 3. 单例进行请求并将XML解析为各种属性。 4. 用户控件C获取单例并提取其数据。 5. 用户控件A从单例中提取数据。 6. 用户控件B获取单例并提取其数据。
现在我考虑到了,我需要向"进行请求"方法添加某种阻止机制,以便我不会同时多次调用它——我对C#还比较新,最简单的方法是什么?用户控件是否同时运行?有没有关于这方面的好的概述?
问题是“在C#中,单例模式是否会在页面请求之间重新实例化?”,但我想更一般地问一下,“我是不是做了一件傻事”,“完成这件事的最佳方式是什么?”或者“有没有更容易实现我想要的功能的方法?”。

这对于您网站的不同访问者会如何工作?每个人都会有相同的XML吗? - Alastair Pitts
不,XML请求根据用户访问的页面而异 - 所以我希望单例模式将为每个单独的请求实例化一次,否则每个人都会看到相同的数据,而他们实际上不应该看到。 - George
2
问题在于单例模式不会为每个用户实例化。因此,单例一词表示只有一个实例。除非你做了一些奇怪的事情,否则单例模式对你没有帮助=P,在这种情况下,它可能不再被视为单例模式。 - Matthew Cox
3个回答

6
作为一般规则,如果我的直觉是Singleton,则我认为我做错了(正如您也感到直观)。
如果您想要每个页面请求一个XML请求,并且数据在控件之间共享,我会像这样做:
public class Page : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    { 
        string data = DoXMLRequest();
        ucControl1.Data = data;
        ucControl2.Data = data;
        ucControl3.Data = data;
    }
}

确保每个控件都有一个公共属性,其类型与您的 XML 请求代码返回的类型相同(在本示例中为字符串)。
参考资料:
页面对象调用页面对象上的 OnLoad 方法,然后递归地对每个子控件执行相同的操作,直到加载页面和所有控件。各个控件的 Load 事件发生在页面的 Load 事件之后。
来源:ASP.NET 页面生命周期概述(可作为一个良好的概述)。

1
谢谢Graphain,这样做简单得多,避免了单例 - 今天我学到了我可以将数据传递到用户控件的层次结构中。 :) - George


1
一个单例在C#的页面请求之间会被重新实例化吗?
不会。只要类在内存中,静态值将在页面请求、会话和用户之间保持不变。这类似于将某些内容放入应用程序缓存中。更好的解决方案首先是使用会话(每个用户),然后是HttpCache(特别是因为它可以过期值),最后(如果您绝对必须)是真正的单例。如果这些数据需要在每个页面上重新创建,则按照MattMitchell的建议在Page_Load中构建它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接