一个ASP.NET专家的快速问题。对我们公司来说,这是一个可争辩的时刻......
我们已经为我们的网站建立了一个很好的(没有错误)CMS框架......
它是这样的:
MyCms.Content.Channels channels = new MyCms.Content.Channels();
在实例化Channels类时,它会加载一堆XML文件并将它们转换为Channels类中保存的List<MyCms.Content.Channels.Channel>
,并使用System.Web.HttpRuntime.Cache
进行缓存(直到有对包含XML文件的文件夹的任何更改)
Channels类基本上是网页的层次结构......
我们通常在ASP.NET页面中使用它(代码隐藏):
public partial class Default : System.Web.UI.Page
{
public MyCms.Content.Channels channels;
public MyCms.Content.Images images;
public MyCms.Content.Channels.Channel CurrentChannel;
public List<MyCms.Content.Channels.Channel> latestItems;
public MyCms.Content.GameVotes votes;
public MyCms.Content.GameVotes.Vote vote;
protected void Page_Load(object sender, EventArgs e)
{
channels = new MyCms.Content.Channels();
images = new MyCms.Content.Images();
..
}
正如您所看到的,公共变量'channels'在Page_Load()...实例化,目前它已从文件系统或缓存中加载了一堆XML文件......
我们的同事有时会在Page_Load()之外实例化这个类 - 就在这个'channels'变量的公共声明旁边:
public partial class Default : System.Web.UI.Page
{
public MyCms.Content.Channels channels = new MyCms.Content.Channels();
protected void Page_Load(object sender, EventArgs e)
{
......他在各种用户控件中做同样的事情......
现在事情是..我需要你的意见是否可以实例化这样一个非常活跃的类 - 在Page_Load()事件之外......? 我们的同事建立的网站不时挂起整个IIS,我只是怀疑这可能是一个原因...... - 您觉得怎么样? :)
同样的CMS框架正在其他网站上使用,在其他服务器上完全没有问题......所以我可以在良好的工作网站和悬挂的网站之间找到唯一的区别 - 这是..实例化在Page_Load()...
范围之外的“频道”类答案 0 :(得分:2)
它不应该有所作为。这并不是说它没有。
所有发生的事情是你正在改变从load事件创建对象的点,这个事件发生在生命周期的一半到构造函数的最开始。在这两点上,缓存应该是可用的,因为它是上下文的一部分,尽管你真的应该检查它。
我想说,实例化这样一个重要的类应该发生在特定的点上,比如页面初始化或加载,而不是构造函数。
西蒙
答案 1 :(得分:0)
我唯一的区别是,如果你初始化Page_Load
之外的对象,一旦你的页面的类被创建(即在所有的Page_XXX事件之前),它们就会被创建,如果你在Page_Load
内初始化它们只有在调用事件时才会创建它们。
这意味着如果您的应用程序崩溃,重定向或因任何原因未进入Page_Load
,您就无法创建该对象。