これも迷惑になっています-それはDRYではありません
それは本当だ。しかし、あなたが持っているすべてのタイプに蔓延する横断的関心事に対してできることはたくさんあります。どこでもロガーを使用する必要があるため、これらのタイプのプロパティが必要です。
それで、私たちがそれについて何ができるか見てみましょう。
シングルトン
シングルトンはひどい<flame-suit-on>
です。
2番目の例で行ったように、プロパティインジェクションを使用することをお勧めします。これは、魔法に頼らずにできる最高のファクタリングです。シングルトンを介して非表示にするよりも、明示的な依存関係を設定することをお勧めします。
しかし、シングルトンがあなたがしなければならないすべてのリファクタリング(水晶玉の時間!)を含めてあなたにかなりの時間を節約するなら、私はあなたがそれらと一緒に暮らすことができるかもしれないと思います。シングルトンの使用があったとしたら、これはそれかもしれません。あなたがあなたの考えを変えたいと思うならば、それが得るのと同じくらい高くなるであろうコストを覚えておいてください。
これを行う場合は、Registry
パターン(説明を参照)を使用して他の人の回答を確認し、シングルトンロガーインスタンスではなく(リセット可能な)シングルトンファクトリを登録している人を確認してください。
それほど妥協することなく同様に機能する可能性のある他の選択肢があるので、最初にそれらをチェックする必要があります。
VisualStudioコードスニペット
Visual Studioコードスニペットを使用して、反復的なコードの入力を高速化できます。のようなものを入力できるようlogger
tabになり、コードが魔法のように表示されます。
AOPを使用してドライオフ
PostSharpのようなアスペクト指向プログラミング(AOP)フレームワークを使用してその一部を自動生成することにより、そのプロパティインジェクションコードの一部を削除できます。
完了すると、次のようになります。
[InjectedLogger]
public ILogger Logger { get; set; }
また、メソッドトレースサンプルコードを使用して、メソッドの開始コードと終了コードを自動的にトレースすることもできます。これにより、ロガープロパティの一部をまとめて追加する必要がなくなる可能性があります。クラスレベルまたは名前空間全体で属性を適用できます。
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif