4

IoCコンテナとしてNinjectを使用して動的インジェクションを処理するフレームワーク拡張機能に取り組んでいますが、これを実現する方法を見つけるのに問題があります。

IModule(s)私のフレームワークには、MVCやWebFormsなどで簡単に使用できるように渡すことが期待されています。したがって、クラスは次のように構成されています。

public class NinjectFactory : IFactory, IDisposable {
  readonly IKernel kernel;
  public NinjectFactory(IModule[] modules) {
    kernel = new StandardKernel(modules);
  }
}

これは問題ありません。単体テストでインスタンスを作成し、の基本的な実装に合格することができます(テストに推奨されていると思われるIModuleビルドを使用)。InlineModule

問題は、注入する必要のあるタイプがわかるのは実行時までではなく、次のようなメソッドで、拡張しているフレームワークを介して要求されることです。

public IInterface Create(Type neededType) {

}

そして、これが私が困惑しているところです、私はチェックするための最良の方法がわかりません->作成(必要な場合)->戻る、私はこれまでにこれを持っています:

public IInterface Create(Type neededType) {
  if(!kernel.Components.Has(neededType)) {
    kernel.Components.Connect(neededType, new StandardBindingFactory());
  }
}

これにより、コンポーネントコレクションに追加されますが、インスタンスが作成されたかどうか、またはインスタンスを作成しての引数を渡す方法がわかりません.ctor

私はこれを正しい方法で行っていますか、それともNinjectはそのように使用されることさえ意図されていませんか?

4

2 に答える 2

7

Ninject の内部を変更または拡張したい場合を除き、Componentsカーネルのコレクションに何も追加する必要はありません。バインディングがタイプに使用できるかどうかを判断するには、次のようにします。

Type neededType = ...;
IKernel kernel = ...;

var registry = kernel.Components.Get<IBindingRegistry>();
if (registry.Has(neededType)) {
  // Ninject can activate the type
}
于 2010-01-06T04:04:25.067 に答える
0

非常に遅い回答ですが、Microsoft.Practices.Unityは App.Config を介した遅延バインディングを許可します

誰かがこの質問に出くわした場合に備えて

于 2018-06-22T11:48:18.490 に答える