39

私はIoCとしてAutofacを使用しており、DIのトピックで読んだすべてのことから、「コンストラクターインジェクション」を使用してクラスの依存関係を明示的に公開することを教えています...ただし、Log4Netでロギングファサード(Common.Logging)も使用して作成しましたそれを注入するAutofacモジュール。これで、ロギングを実行するすべてのクラスに、追加のコンストラクターパラメーターがあります(サンプル#1を参照)。

ロギングファサードを使用するときにロギングDIが必要かどうか疑問に思っていますか?コンストラクターの署名を介して依存関係を明示的に公開することは、優れたアーキテクチャーであることを理解しています。 しかし、ファサードをログに記録する場合、次のことが当てはまると思います。

  • いつでもロギングフレームワークを「スワップアウト」できます
  • クラスIMHOは実際にはロガーに依存していません。ロギングが構成されていない場合は、NullLoggerが使用されます。それはほとんど「あなたがそれを必要とするならそれはthreです」対「あなたがそれを供給しない限りそれは機能しない」種類の取引です...(サンプル#2を見てください)

それで、他の人はどう思いますか?ロギングファサードを注入するのはやり過ぎですか?このトピックについても同様の質問がいくつかありますが、より一般的な用語(インフラストラクチャ)-私は主にロギングに興味があります...。

// IoC "way"
public class MyController : BaseController
{
    private readonly ILog _logger;

    public MyController(ILog logger)
    {
        _logger = logger;
    }

    public IList<Customers> Get()
    {
        _logger.Debug("I am injected via constructor using some IoC!");
    }
}

// just use the logger "way"
public class MyController : BaseController
{
    private static readonly ILog Logger = LogManager.GetCurrentClassLogger();

    public IList<Customers> Get()
    {
        Logger.Debug("Done! I can use it!");
    }
}
4

6 に答える 6

34

ロギングは単なるインフラストラクチャです。注射はやり過ぎです。個人的には、抽象化レイヤーも使用していません。ライブラリが直接提供する静的クラスを使用します。私の動機は、現在のプロジェクトでロギング ライブラリを切り替える可能性は低いということです (ただし、次のプロジェクトでは切り替える可能性があります)。

ただし、例ではコントローラーを使用しています。なぜログインする必要があるのですか?コントローラーは、ビューとモデル (ビジネス ロジック) の間の単なるアダプターです。ログインする必要はありません。

通常、ビジネス ロジックを含むクラスにのみログインし、最上位層で未処理の例外をログに記録できるようにします。これらはデバッグが難しいケースであるため、ログが必要な場所です。

他の場所でログを記録する必要があるということは、ビジネス ロジックを適切にカプセル化するためにリファクタリングする必要があることを示しています。

于 2012-09-26T18:49:31.840 に答える
4

さて、ロギングを行いたいすべてのクラスで、追加のコンストラクターパラメーターがあります

システムで多くのクラスをログに記録する必要がある場合は、設計に何か問題があります。ロギングは横断的な問題であり、ロギングのような横断的な問題でクラスを混乱させるべきではないため、ログを取りすぎているか、単一責任の原則に違反しています。

半年前に(まったく別の)質問に答えましたが、私の答えはあなたの質問に当てはまります。これを読んでください。

于 2012-09-26T15:02:04.533 に答える
3

個人的にはやり過ぎだと思います。

ロギングのオーバーヘッドは理想的には非常に低くなければならないため、クラスごとに 1 つの静的ロガー インスタンスを使用する方が優れたソリューションのように思えます。オーバーヘッドを低く抑えることで、インストルメンテーションにデバッグ レベルのログを使用することが促進されます。

于 2012-09-26T16:56:57.060 に答える