1

Ninject の例の多くは非常に基本的なものです。それは単なるコントローラーであるか、デモンストレーションのためにカーネルとオブジェクトを単一の関数で作成します。

何らかの理由で、通常のようにオブジェクトをインスタンス化するだけで、Ninject がそれをインターセプトして機能すると考えました。例えば:

public class foo 
{
    public foo(IInjectable injected)
    {
       //stuff
    }
}

次に、別のクラスのどこかで次のことができます。

var fooObject = new foo();

代わりにkernel.getを使用することになっていますか?

次に、カーネルを呼び出し続ける必要がある場合、それを必要とするすべてのものにどのように渡すのですか?

4

2 に答える 2

1

アプリケーションを適切に設計すれば、アプリケーションで単一のKernel.Getリクエストのみが発生するはずです (多くの場合、 のようなものを介してNinject.MVC3)。通常、ここでアプリケーションのルート オブジェクトがインスタンス化されます (アプリケーション シェルの MainViewModel など)。他のすべての型は、依存関係の作成と管理の責任者を知らずに、コンストラクターで依存関係を宣言するだけです。ちょっとした例

public class Main {
   // Somewhere
   var mainViewModel = Kernel.Get<MainViewModel>();
   mainViewModel.Initialize();
}

public class MainViewModel {
    ctor(ISectionViewModelFactory factory, ISectionViewModel sectionViewModel) {
    }

    public void Initialize() {
       // use injected factory etc.
    }
}

public class ApplicationModule : NinjectModule {

   public override void Load() {
      Bind<ISectionViewModel>().To<SectionViewModel>();
      Bind<ISectionViewModelFactory>().ToFactory(); // <-- requires factory extension
   }
}

アプリケーションは、他の場所でカーネルにアクセスすることなく、それ自体を構築します。

ビットのファクトリ拡張を参照してください。ToFactory()

于 2012-08-16T17:02:12.293 に答える
0

ここでのアプローチは、 fooも注入する場合にのみ機能します(一般に、カーネルをクラスに注入し始めるのは良い考えではありません。いわば、制御の反転を反転し始めるからです)。

コンテキストがないとわかりにくいですが、上記のコードが別のクラスbarに含まれているとしましょう。次に、次のように進めます。

public class bar
{
    foo _fooObject;

    public bar(foo fooObject)
    {
        _fooObject = fooObject;
    }
}

そしてもちろん、fooのバインディングが設定されます。たとえば、次のようになります。

Bind<foo>.ToSelf();

bar内にfooの複数のインスタンスを作成する必要がある場合は、ファクトリを使用できます。

public class bar
{
    fooFactory _factory;

    public bar(fooFactory factory)
    {
        _factory = factory;
    }

    void baz()
    {
        foo fooObject = _factory.GetNew();
    }
}
于 2012-08-17T04:03:47.900 に答える