リフレクションを使用して、実行時にいくつかのクラスをプログラムにロードします。これらのクラスがメイン プログラムと同じロギング クラスを使用できるようにしたいと考えています。
先のことを考えて、これをどのように処理しますか?静的クラスを使用すると機能しますか?
私が望むものにはやり過ぎなので、ロギングフレームワークは使用したくありません。
ありがとう。
本当にロギング フレームワークを使用したくない場合 (これは理解できます)、Singleton パターンを参照することをお勧めします。
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
このクラスは、すべて同じインスタンス.Instance
を共有する属性からのみ作成/アクセス/到達できることに注意してください。
log4netを見てください。それはあなたが望むすべてのものを処理します。また、特別な場所にログを記録する必要がある場合は、独自のアペンダーを実装してください。他のロギングフレームワークは、必要な機能を提供します。ロギングを作り直す必要はありません。
シングルトンを使用したい場合は、C# ではより簡潔な方法で実装できることに注意してください。
public class Singletone
{
public static readonly Singletone Instance = new Singletone();
private Singletone() {}
// other methods
public void DoTheJob(){}
}
// usage
Singletone.Instance.DoTheJob();
この実装により、遅延初期化 (クラスがアプリ ドメインで初めて使用されるときにのみフィールド初期化子が実行される) やスレッド セーフ (静的初期化子は .NET でスレッド セーフであることが保証されている) などの問題が解決されます。
ロガーの実装を ILogger という名前の共通インターフェイスでラップできます。ロードするすべてのクラスは、コンストラクターでインターフェイスを受け入れます。作成時にロガーの実装をそれらに注入できます。また、実行時の読み込みについてですが、MEF について聞いたことがありますか? http://msdn.microsoft.com/en-us/library/dd460648.aspx - その点で役立つ可能性があり、ロードする新しいクラスにロガーの依存関係を自動的に挿入します
クラスによって参照されるシングルトンロガーは、ロガーをコードベースから作成したクラスに緊密に結合するため、良いとは思いません。コンストラクターでの注入とインターフェースは、それらをロガーから疎結合し、より独立してテスト可能にします。