在Page_Load之外实例化活动类是否正确?

时间:2011-07-13 10:27:45

标签: asp.net

一个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()...

范围之外的“频道”类

2 个答案:

答案 0 :(得分:2)

它不应该有所作为。这并不是说它没有。

所有发生的事情是你正在改变从load事件创建对象的点,这个事件发生在生命周期的一半到构造函数的最开始。在这两点上,缓存应该是可用的,因为它是上下文的一部分,尽管你真的应该检查它。

我想说,实例化这样一个重要的类应该发生在特定的点上,比如页面初始化或加载,而不是构造函数。

西蒙

答案 1 :(得分:0)

我唯一的区别是,如果你初始化Page_Load之外的对象,一旦你的页面的类被创建(即在所有的Page_XXX事件之前),它们就会被创建,如果你在Page_Load内初始化它们只有在调用事件时才会创建它们。

这意味着如果您的应用程序崩溃,重定向或因任何原因未进入Page_Load,您就无法创建该对象。