4

最近Ninjectを使い始めたWinFormsアプリケーションがあります。Ninject のチュートリアルの大部分は、次のような自動配線のセットアップを示しています。

using (IKernel kernel = new StandardKernel())
{
     kernel.Bind<ITaxCalculator>()
        .To<TaxCalculator>()
        .WithConstructorArgument("rate", .2M);

     var tc = kernel.Get<ITaxCalculator>();
     Assert.Equal(20M, tc.CalculateTax(100M));
}

短いスクリプトの起動時にそのクラスを実装するつもりなら、それは素晴らしいことですが、アプリケーションの他のクラスやライブラリでこれらのオブジェクトを使用する方法がわかりません。この記事では、Ninject が Spring と同様の依存関係を処理できるかどうかに興味がありました。

package testbean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import writer.IWriter;

@Service
public class MySpringBeanWithDependency {
    private IWriter writer;

    @Autowired
    public void setWriter(IWriter writer) {
        this.writer = writer;
    }

    public void run() {
        String s = "This is my test";
        writer.writer(s);
    }
}

次に、IWriter に挿入するインスタンスを XML で指定できます。次に、コードを実行するには、これが必要なすべてです。

package main;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import testbean.MySpringBeanWithDependency;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("META-    INF/beans.xml");
        BeanFactory factory = context;
        MySpringBeanWithDependency test = (MySpringBeanWithDependency) factory
                .getBean("mySpringBeanWithDependency");
        test.run();
    }
}

Spring では、IWriter 依存関係を自動的に作成および注入できるため、アプリケーションの残りの部分に依存関係を取得する方法について心配する必要はありません。現在の Ninject チュートリアルを使用しても、これを行う方法を見つけることができず、オブジェクトを別のオブジェクトに格納してから呼び出すことに頼っていましたが、これは最善の方法ではありません。

Ninject を使用して依存関係を自動配線する方法について高低を調べましたが、この特定の質問に対する答えは見つかりませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

4

推奨される方法は、コンストラクター注入を行うことです

public class MySpringBeanWithDependency {
    private IWriter writer;

    public MySpringBeanWithDependency(IWriter writer) {
        this.writer = writer;
    }

    public void run() {
        String s = "This is my test";
        writer.writer(s);
    }
}

Kernel.Bind<IWriter>().To<SomeWriter>();
Kernel.Get<MySpringBeanWithDependency>();

上記のような 1 つずつバインドする代わりに、規則を使用してバインディングを指定する必要がありますhttps://github.com/ninject/ninject.extensions.conventions/wiki/What-is-configuration-by-convention

そして、もっと大きな観点から考え、アプリケーションの開始時に 1 回の get で可能な限り取得する必要があります。

于 2012-06-10T10:12:17.063 に答える