我有3个用户控件,每个用户控件都需要根据各种URL参数等从XML Feed中提取数据。现在,此XML Feed中的数据对于所有3个用户控件都是相同的,因为它们都发送了相同的请求。
对于相同的数据做出3个单独的请求似乎很愚蠢。
我的想法是拥有一个我将调用的单例,它将向XML服务发出一个请求,然后将精确解析的结果呈现给用户控件。
即:
现在我考虑一下,我需要为“make a request”方法添加某种阻塞,这样我就不会同时多次调用它 - 我对C#很新,是什么最简单的方法吗?用户控件是否同时运行?这个地方有一个很好的概述吗?
问题是“在C#中的页面请求之间是否会重新实现单例?”,但我想一个更普遍的问题是“我做的很傻”,“最好的方法是什么?”或“有更简单的方法来做我想做的事吗?”。
答案 0 :(得分:6)
作为一般规则,如果我的直觉是单身人士,我认为我做错了(因为你同样直觉)。
如果你想要每个页面请求一个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请求代码返回的类型的公共属性(在此示例中为字符串)。
供参考:
Page对象调用OnLoad 在Page对象上的方法,然后 递归地为每个人做同样的事情 孩子控制直到页面和所有 控件已加载。 Load的事件 个别控制发生在 加载页面的事件。
来自:ASP.NET Page Life Cycle Overview(应作为一个很好的概述)。
答案 1 :(得分:1)
是否会在C#中的页面请求之间重新实现单例?
没有。只要该类在内存中,静态值将在页面请求,会话和用户之间保持不变。它类似于在Application缓存中放置一些东西。一个更好的解决方案首先是会话(每个用户),然后是HttpCache(特别是因为能够使值过期),最后(如果你绝对必须)一个真正的单例。如果要在每页重新创建此数据,则在MattMitchell建议的Page_Load中构建它。
答案 2 :(得分:1)
如何使用HttpContext.Items 见http://www.4guysfromrolla.com/articles/060904-1.aspx