3

基本のglobal.asaxクラスを継承して、カスタムのglobal.asaxクラスを作成しようとしています。しかし、私のカスタム継承グローバルクラスは正しく機能しません。そのApplication_Startは呼び出されません。

ホエイを知っている人はいますか?

public class BaseGlobal : HttpApplication
{
    protected void Application_Start(Object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure();
        Logger.Warn("Portal Started");  //I can find it log file
    }
    ......
}


public class MyGlobal : BaseGlobal
{
        new protected void Application_Start(Object sender, EventArgs e)
        {
            base.Application_Start(sender,e);

            Logger.Warn("Portal Started 2"); // Can not find it in log file
        }
}


<%@ Application Codebehind="Global.asax.cs" Inherits="Membership_ABC.MyGlobal" Language="C#" %>

ログファイルに「Portalstarted2」が見つかりませんでしたが、「PortalStarted」だけが見つかりました。

何か案は?

4

2 に答える 2

3

アプリケーションの起動時に、ランタイムはファイルHttpApplicationによって示される子孫を取得し、そのインスタンスを作成します。Global.asaxランタイムは、クラスがどのように子孫になるかを認識または気にせずHttpApplication、実際には子孫であることを気にします。

その後、メソッドの呼び出しを開始し、通常のHttpApplicationオブジェクトとして扱います。修飾子は継承チェーンを効果的に切断するためnew(古いメソッド名を共有するのはたまたま新しいメソッドです)、呼び出されませんが、代わりに親クラスのメソッドが呼び出されます。基本的に、この状況が発生します(擬似コード):

HttpApplication httpApp = new MyGlobal();
httpApp.Application_Start(..) 
// ^^^ calls BaseGlobal.Application_Start(..)
//because the is not an unbroken chain from HttpApplication to MyGlobal

これは、EricLippertが詳細に書いたトピックであるBrittleBaseClass問題の例と結果です。

于 2012-11-28T13:18:05.500 に答える
1

解決策は、基本クラスで関数virtualを宣言してから、子クラスでそれをオーバーライドすることです。

ただし、基本クラスを編集してApplication_Startメソッドを仮想として宣言することはできないため、機能しません 。非仮想メソッドをオーバーライドすることは可能ですか?

受け入れられた答えは、あなたのケースに一致する例を示しています。

于 2012-11-28T13:00:18.000 に答える