グローバル設定のインスタンスに渡されるか、直接参照
-
06-09-2019 - |
質問
私は、コンソールアプリケーションの起動時にインスタンス化され、静的変数に格納されますロギングクラスを持っています。
私はクラスがロガーを使用したい場合は、これは、コンストラクタでクラスに渡されるか、直接参照すべきですか?
私はユニットテストと私はそれを行うことができるはずのいずれかの方法を記述しようとしています。ちょうど私がそれを使用するコードを呼び出す前に静的変数を設定しなければならないことを意味ます。
乾杯ます。
正しい解決策はありません
他のヒント
が鳴ります。あなたは EntLibのユニティのまたはそのような何か他のものを使用することができます。
できるだけテスト可能な単位としてあなたのクラスを作成するには、ロガーなど、すべての依存関係は、可能な限りに渡す必要があります。これは、依存性注入(DI)と呼ばれるものであり、単位テスト可能なコードを記述するための非常に一般的かつ標準パターンです。ロギングはほとんど常に適切にこれらの懸念を引き出し、宣言的にそれらを適用するための任意のまともなAOPフレームワークが実際に存在しないので、唯一のメソッドの本体内に埋め込まれた横断的関心事です。ただ、おそらくあなたは本当に簡単として、あなたのテストを維持し、可能な限り対象としたい場合、追加の設定の問題を追加し、テストの複雑さを増すユニットテストを実行している/書き込み時に伐採に対処すること。
どのように静的ゲートウェイ・パターンを使用してはどうですか?
あなたはそれのインスタンスを作成し、そのインスタンスを格納し、同じクラスのメンバーとして&プロパティを経由してそれを返すことができます。
例えば。 Logger.Default
これは、作成されたインスタンスへの参照を返します。
EDIT:この例はConsoleクラスかもしれない&それは方法をSetOutています。 私はあなたがConsole.WriteLineをを使用し続けることを意味....あなたは、ストリームを変更したい場合は、SetOutメソッドを使用します。それは新しいストリームに出力をリダイレクトします。
希望に役立ちます。