私は、Eclipse 4は、あなたのクラスのオブジェクトを注入する方法を、次の3つの方法を知っている:Eclipseのランタイムはそれがインスタンス化するクラスに関連する注釈を探します起動時
- 。
- 1.に注入されたオブジェクトは追跡され、変更されると再注入されます。
- ContextInjectionFactoryとIEclipseContextを使用して注入を手動でトリガーします。
3番目のオプションで希望することがあります。 Hereは、コード例です。
ManipulateModelhandler man = new ManipulateModelhandler();
//inject the context into an object
//IEclipseContext iEclipseContext was injected into this class
ContextInjectionFactory.inject(man,iEclipseContext);
man.execute();
問題はありますが、 IEclipseContextは、注入が必要なオブジェクトにアクセスできるクラスに既に注入されている必要があります。必要な注入の回数に応じて、代わりに委任を使用する方が便利です(テスト容易性は1つの引数になります)。
@Inject
public void setFoo(Foo foo) {
//Bar is not attached to the e4 Application Model
bar.setFoo(foo);
}
したがって、より良い解決策はおそらく@Creatable注釈を使用することです。 あなたのクラスに注釈をつけ、それに引数のないコンストラクタを与えます。
@Creatable
public class Foo {
public Foo() {}
}
上記のメソッドのように@Injectを使用すると、Eclipseがインスタンス化して挿入できるようになります。 ContextInjectionFactory.inject(..)の場合のように、オブジェクトの作成をもう制御できないという欠点があります。
ほとんどの人が、注入されたインスタンスを必要とする包含クラスにjavax.inject.Providerを注入することを検討したいと思うかもしれません。 –
アプリケーションモデルで定義されていないクラスで 'ContextInjectionFactory.inject(man、iEclipseContext) 'というステートメントが実行されている場合は、' IEclipseContext'を取得しますか? – kenshinji
@kenshinjiおそらくこの[回答](https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722)が役に立ちます。しかし、これがあなたのコンテキストを与えるのではなく、むしろコンテキストを与えることを指摘することは重要です。 Eclipseはコンテキストオブジェクトのツリーを保持し、必要な値がその中に含まれているかどうかは、ユースケースによって異なります。おそらく 'E4Application.createDefaultContext()'も見てください。 –