2009-04-28 13 views
1

私は、開発したソリューション全体で使用されるロギング用の静的クラスを作成しています。ロギングが機能するには、このようななどのコンソールアプリケーション、ASP.NETアプリケーション、としてそれを使用するいくつかのコンポーネント...アプリケーションの起動時に静的クラスのメソッドを自動的に呼び出す方法

がありますが、それは使用することができます前に、いくつかの初期起動時の設定を行う必要があり、また、いくつかの各アプリケーションの終了時にクリーンアップします。

.NETでこれを行う方法はexpicitly溶液中の各アプリケーションからStartLog()とFinishLog()メソッドを呼び出すことなく、ありますか?あるいはこれを完全に見ている別の方法でしょうか?私は、ロギングクラスが初期化されているかどうかをチェックするために、各ログ()メソッドでロックを使用することについて考えてきた

は、しかし、両方のパフォーマンスと複雑さの潜在的なオーバーヘッドは私をおびえさせます。あなたが最初のクラスを使用するときに自動的に呼び出されます -

答えて

3

あなたは物事の起動側のタイプ初期化子(例えば、静的コンストラクタ)を使用することができます。

検出シャットダウンは困難です... ちょうどイベントをサブスクライブし、それに応じて反応する...あなたのために十分であるかもしれないAppDomain.ProcessExitAppDomain.DomainUnloadがあります。シングルトン上に読む

+0

これでも、StartLog()を呼び出す必要があります(つまり、最初にクラスを使用する必要があります)。私はその周りに道があるとは思わない、ちょうどもっと明示することが良いかもしれないと思った。 –

+0

私は静的なコンストラクタとその同等のデストラクタであるAppDomain.DomainUnloadを見ています。しかし、MSDNではDomainUnloadイベントが既定のアプリケーションドメインで生成されることはないので、これはオプションではないようです。 –

+0

それで、私はProcessExitも見てみることをお勧めしました:) –

2

は、ジョンスキートはgreat articleを持っています。これを使用すると、型が1回だけ構築されることを保証できます。彼がロックのパフォーマンスについて話すときに最後を見てください。思考のためのちょっとした食べ物。

0

あなたはLogクラスを毎回再インスタンス化するが、おそらくあなたのための最良の働くだろう

1

SingletonパターンをうまくいくのgetInstance()メソッドを使用していないことにより、シングルトンパターン。静的_instance変数は開始時に初期化されるため、Log()コンストラクターが呼び出され、ここで初期化を実行できます。 IDisposableを実装し、Finalizeをオーバーライドすると、アプリケーションが終了して静的インスタンス変数が破棄されたときに呼び出されるDispose()メソッドがあります。

public class Log : IDisposable { 
    private Log() { 
    // Initialize logic 
    } 

    public LogMessage(string wah) { 
    // Write 
    } 

    public void Dispose() { 
    // Clean up 
    } 

    public override void Finalize() { 
    Dispose(); 
    } 

    private static Log _instance = new Log(); 
    public static Log Instance { get { return _instance; } } 

    // You can also implement helper methods on static level if you want to keep the usage same. 
    public static Message(string wah) { 
    _instance.LogMessage(wah); 
    } 
} 
+0

あなたは、プロセスが終了するとDisposeが自動的に呼び出されることを暗示しているようです。これはそうではありません。 –

+0

ああ。参りました。それをFinalizeと混ぜてください。 –

関連する問題