1

(WCF)プロジェクトにninjectモジュールをロードしていて、カスタムプロバイダーを使用してモジュールにlog4netを接続したいと考えています。私がプロバイダーを使用している理由は、GetLoggerメソッドがインジェクションが行われているクラスを通過する必要があるためです。これがこれを行う方法ではない場合は、私に知らせてください。私はNinjectを初めて使用します。(Context.getType()は正しくありませんが、これを行うのに問題があります。)

主な問題は、コンストラクターの実行後にクラスのILog変数が初期化されることですが、コンストラクターでロギングを使用できるようにしたいです。また、Ninjectを使用してコンストラクターを呼び出し、そのパラメーターを具象クラスにバインドしています。

Bind<IBroker>().To<Broker>(); // constructor
Bind<ILog>().ToProvider(new log4netILogProvider()) // property
private class log4netILogProvider : Ninject.Activation.Provider<ILog>
    {
        protected override ILog CreateInstance(IContext context)
        {
            return LogManager.GetLogger(context.getType());
        }
    }

すべての助けに感謝します。

4

2 に答える 2

2

IoCフレームワークは、コンストラクターインジェクションの前にプロパティインジェクションを実行できません。IoCフレームワークは、手動で作成されたファクトリで実行できるのと同じことしか実行できません。正しく作成される前に、ファクトリ内のオブジェクトのプロパティにアクセスすることはできませんか?したがって、IoCフレームワークはできません。

基本的に2つのオプションがあります。

  1. コンストラクターインジェクションを実行します(推奨)
  2. メソッドインジェクションを実行し、メソッドでコンストラクターコードを実行します。

    [Inject]
    public void Initialize(ILog log) { ... } 
    
于 2010-11-27T22:42:20.490 に答える
0

3番目のオプションも提案します。NinjectのIInitializableインターフェイスを実装してから、プロパティインジェクターに依存するコードをInitialize()の実装に移動できないかどうかを確認できます。Ninjectは、Initializeが呼び出される前に、すべてのコンストラクターインジェクションと適切なインジェクションが終了することを保証します。

于 2011-11-11T23:46:45.880 に答える