5

アプリケーションで Castle Windsor の制御の反転を使用しています。アプリケーションが最初に読み込まれるときにIWindsorContainer.Resolve、コンポーネント (特にファクトリ) をインスタンスに解決します。

たとえば、メソッドがロガーを作成する(または を実装するもの)ILoggerFactoryに解決されます。各クラスに電話をかけたいです。ただし、各クラスのコンストラクターにを渡したくありません。MyCustomLoggerFactoryILoggerFactoryCreateLogger()ILoggerFactory.CreateLogger()ILoggerFactory

毎回ILoggerFactory呼び出すことなく、各クラスが特定のファクトリにアクセスして使用するにはどうすればよいでしょうか?IWindsorContainer.Resolve

4

2 に答える 2

3

私の知る限り、windsor コンテナーから依存関係を取得する方法は 3 つあります (ちなみに、最下位レベルのクラスを除いて、何も明示的に解決する必要はありません。コンテナーにすべて登録されていることを確認してください)。依存関係はあなたのために配線されています):

  1. コンストラクター引数を追加します (これは必須の依存関係と見なされます)
  2. クラスにプロパティを追加します (これはオプションの依存関係と見なされます)。
  3. IWindsorContainer インスタンスを取得し、Resolve を呼び出します (通常、これは悪い考えです)。

通常、特にログを記録する場合は、それをオプションの依存関係にするので、オプション2に進み、次のようにします(私はあなたの ILoggerFactory のアイデアを使用しました。実際には、これには独自のファクトリを定義しません-後で参照してください):

private ILoggerFactory _loggerFactory = LoggerFactory.NullLoggerFactory;

public ILoggerFactory LoggerFactory
{
    get { return _loggerFactory; }
    set { _loggerFactory = value; }
}

そうすれば、コードで LoggerFactory プロパティを使用できます。コンテナーに追加されていない場合は、「null」バージョン (これは、何もしないロガーを作成する ILoggerFactory の単なるインスタンスです) を取得します。実際のバージョンを取得します(使用時に null をチェックするか、使用することがわかっている場合はそれを使用するだけです)。ロガーが必要なクラスでこのプロパティを定義すれば完了です。

さておき

ちなみに、代わりに使用できる Windsor のログ機能のようなものがあります。これには小さな問題があります。これは、コード ベース全体で Windsor インターフェイスが必要ないため、過去に行ったことが定義されているためです。私自身の ILogger インターフェイス (およびその null 実装) を作成し、ILogger インターフェイスを実装するが、実際のログ記録を行うために呼び出される城 ILogger に依存する「キャッスル ロガー プロキシ」を作成しました。そうすれば、それを独自のアセンブリに分離することができ、アプリケーションは Windsor が依存関係を注入していることを認識できません。

多分あなたは気にしないでしょう、ただ私がそれについて言及すると思っただけです.

于 2012-04-18T06:58:14.227 に答える
2

API を汚染したくない場合は、次のようにAmbient Contextパターンを使用できます。

public abstract class Logger
{
    static Logger()
    {
        Current = new DefaultLogger();
    }

    public static Logger Current { get; set; }

    // your Logger members
    public abstract void Log();
}

public class DefaultLogger : Logger
{
    public override void Log()
    {
        //do something
    }
}
于 2012-04-18T08:11:11.257 に答える