2011-07-13 9 views
0

ASP.NETエキスパートのための簡単な質問。それはPage_Loadの外でアクティブなクラスをインスタンス化するのは正しいですか?

...私たちは私たちのサイトのために使用します(そこではありませんバグ)素敵なCMSのフレームワークを構築しています...現時点で

会社では私たちのために議論の余地の瞬間です。これは次のようになりますこの:

変更があるまで( System.Web.HttpRuntime.Cacheを使用してチャンネルのクラスをインスタンス化した瞬間に、それはXMLファイルの束をロードし、チャンネルのクラス内に保持され List<MyCms.Content.Channels.Channel>に変換して、キャッシュされた
MyCms.Content.Channels channels = new MyCms.Content.Channels(); 

XMLファイルを保持するフォルダに)

、あなたが見ることができるよう

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(); 
.. 
} 

チャンネルクラスは

我々は通常、私たちのASP.NETページ(背後にあるコード)でこのようにそれを使用する...基本的にはWebページの階層構造でありますパブリック変数 'c​​hannels'はPage_Load()でインスタンス化されます。現在、ファイルシステムまたはキャッシュからXMLファイルをロードしています。

私たちの同僚は、時にはこのクラスをPage_Load()の外部でインスタンス化する - publicのすぐ隣にこのような「チャンネル」変数のaration:

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 Frameworkが他のサイトで使用されていて、問題のない別のサーバーで使用されています...良い作業サイトとハングアップしているサイトの唯一の違いは、これです。 Page_Load()の範囲外の 'channels'クラスのインスタンス化...

答えて

2

違いはありません。それはそうではないと言っているわけではありません。

すべてのことが起こっているのは、ロードイベントからオブジェクトを作成する時点を変更していることです。これは、開始時に、コンストラクタのライフサイクルのほぼ半分に起こります。どちらのポイントでも、キャッシュはコンテキストの一部として利用可能になるはずですが、実際に確認する必要があります。

しかし、このような重要なクラスをインスタンス化するには、コンストラクタではなく、ページの初期化やロードなどの特定のポイントで発生する必要があります。

サイモン

0

私の知る唯一の違いは、あなたがPage_Loadの外にオブジェクトを初期化する場合、彼らは(つまり、すべてのPage_XXXイベントの前に)できるだけ早くあなたのページのクラスが作成されるように作成されることで、 Page_Loadの内部で初期化すると、イベントが呼び出されたときにのみ作成されます。

つまり、アプリケーションがクラッシュしたり、リダイレクトしたり、何らかの理由でPage_Loadが入力されていない場合は、オブジェクトを無駄に作成しています。

関連する問題