私の知る限り、windsor コンテナーから依存関係を取得する方法は 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 が依存関係を注入していることを認識できません。
多分あなたは気にしないでしょう、ただ私がそれについて言及すると思っただけです.