2012-12-24 5 views
9

インタフェースを実装するオブジェクトを挿入する宣言型サービスを持つOSGIサービスを作成しました。アプリケーションモデル(ハンドラ、パート、....)に接続されているクラスにオブジェクトを挿入すると、正常に動作しています。アプリケーションモデルに添付されていないクラスに挿入すると、常にnullが返されます。アプリケーションモデルに付属していないクラスでeclipse 4 DIを使用するには?

アプリケーションモデルに付属していないクラスでDIを使用することはできますか?私はvogellaチュートリアルを見ましたが、どういうわけか私は解決策を見いだせません。

答えて

6

私は、Eclipse 4は、あなたのクラスのオブジェクトを注入する方法を、次の3つの方法を知っている:Eclipseのランタイムはそれがインスタンス化するクラスに関連する注釈を探します起動時

  1. 1.に注入されたオブジェクトは追跡され、変更されると再注入されます。
  2. 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(..)の場合のように、オブジェクトの作成をもう制御できないという欠点があります。

+0

ほとんどの人が、注入されたインスタンスを必要とする包含クラスにjavax.inject.Provider を注入することを検討したいと思うかもしれません。 –

+1

アプリケーションモデルで定義されていないクラスで 'ContextInjectionFactory.inject(man、iEclipseContext) 'というステートメントが実行されている場合は、' IEclipseContext'を取得しますか? – kenshinji

+0

@kenshinjiおそらくこの[回答](https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecontext-in-an-activator/33230722#33230722)が役に立ちます。しかし、これがあなたのコンテキストを与えるのではなく、むしろコンテキストを与えることを指摘することは重要です。 Eclipseはコンテキストオブジェクトのツリーを保持し、必要な値がその中に含まれているかどうかは、ユースケースによって異なります。おそらく 'E4Application.createDefaultContext()'も見てください。 –

0

これを達成するために、e(fx)クリップの一部をリファクタリングしました。 thisをご覧ください。恥知らずのプラグインを申し訳ありません...

関連する問題