0

私は現在、C# で記述されたクラスを持っています。これは、いくつかの単純なエラー ログ機能を実行します。私のプロジェクト全体で非常に広範囲に使用されています。

class LogError
{
    //constructor
    public LogError() { }

    //public methods
    public void saveToTextFile() { }

    //other similar methods...
}

しかし、メソッドを使用するLogError前にクラスのインスタンスを作成する必要があるたびに、このクラスの良い設計とは思えません。saveToTextFile()

そこで、このクラスを再設計することを考えています。これは、シングルトン パターンを適用する良いケースでしょうか? 代わりに静的クラスにするのはどうですか?助言がありますか?ありがとう。

4

6 に答える 6

1

シングルトンの問題は、異なるロギング動作を使用するのが難しいことです。後で紹介したい画像は「テキストファイルに書き込む代わりにメールを送る」です。あれば基本的に同じです。

new LogError().DoSomething();

また

LogError.Instance.DoSomething();

LogError クラス自体のパフォーマンスおよび/または実装を除きます。

柔軟性を追加したい場合は、依存性注入(さらに、シングルトンよりもコードを明確にする) または依存性ルックアップ (その中間) を使用することをお勧めします。

于 2013-03-01T05:53:55.397 に答える
1

私はApache log4netを見ます。何も心配する必要はありません。構成ファイルから (またはコードで) 複数のターゲットにログを記録するように構成できます。ログ メッセージ テンプレートは完全にカスタマイズ可能です。さまざまなログ レベル (デバッグ/情報/警告/エラー) をフィルタリングしてルーティングできます。ここで車輪を再発明する価値はありません。

于 2013-03-01T06:09:29.913 に答える
0

はい、シングルトンにし、スレッドセーフにします

于 2013-03-01T05:35:57.253 に答える
0

、任意のコンテナー (Autofac、Unity など) を使用している場合は、コンテナーを利用できます。

シングルトンは壊れる可能性があります(リフレクションを使用することにより、通知されます)

実装の1つは(これは明示的なロックを必要としません)

public class  MySingleton
{
    private static readonly MySingleton _singtonInstance =  new MySingleton();
    private MySingleton()
    {

    }

    public static MySingleton SingtonInstance
    {
        get { return _singtonInstance; }
    }
}
于 2013-03-01T05:52:04.827 に答える
0

アプリケーションのどこかで例外が発生したときに呼び出されるロギング メソッドを使用するソリューションがあります。必要なのは、一般的または一般的な例外ハンドラーだけです。方法は次のとおりです。

Program.cs (Application.Run の前の Main() メソッド内) で、このコードを追加します。

 Application.ThreadException += CommonExceptionHandler;

Program.cs ファイルで CommonExceptionHandler イベントを作成します。たとえば、Main メソッドの横にあるとします。

private static void CommonExceptionHandler(object sender, ThreadExceptionEventArgs t)
        {
           LogError(t.Exception);
        }

Program.cs に LogError メソッドを作成します。

 public static void LogError(Exception ex)
        {
            var errMsg = ex.Message;
            errMsg += ex.InnerException != null ? ex.InnerException.Message : string.Empty;
            //TODO: Do what you want if an error occurs
        }

これにより、アプリケーションで発生したすべての例外がキャッチされます。すべてのメソッドのすべての catch ブロックに対してエラー ログ クラスを呼び出すかどうか、もう心配する必要はありません。

于 2013-03-01T07:14:07.160 に答える
0

次のように、インターフェイスをログ システム ファサードとして使用できます。

interface ILoggerFacade{
    void Error(Exception e);
    void Warning(Exception e);
    ....
}

その後、インターフェースの実装を行う必要があります

class SimpleLogger:ILoggerFacade{

    void Error(Exception e){//logging error};
    ...
}

最後に、ロガーへのポイントを入力する必要があります。通常は静的クラスを使用しますが、シングルトンもバリアントです。

静的クラスのサンプル:

 class StaticLogger{

     private ILoggerFacade _logger;
     StaticLogger(){
        //choose ILoggerFacade implementation
        _logger=new SimpleLogger();
     }
     public static ILoggerFacade Logger{
        get{ return _logger;}
     }
 }

ファサード インターフェイスを使用する場合、必要に応じてプロジェクト内のロガーを簡単に変更できます。

于 2013-03-01T06:19:56.823 に答える