2012-12-24 10 views
9

Utworzyłem usługę OSGI z usługami deklaratywnymi w celu wstrzyknięcia obiektu implementującego interfejs. Jeśli wstrzyknę obiekt do klasy, która jest dołączona do modelu aplikacji (program obsługi, część, ....), działa poprawnie. Jeśli wstrzyknę to w klasie, która nie jest dołączona do modelu aplikacji, zawsze zwraca wartość null.Jak używać Eclipse 4 DI w klasach, które nie są dołączone do modelu aplikacji?

Czy możliwe jest użycie DI w klasach, które nie są dołączone do modelu aplikacji? Zajrzałem do tutoriali vogella, ale jakoś nie znalazłem rozwiązania.

Odpowiedz

6

wiem z trzech sposobów jak Eclipse 4 można wstrzykiwać obiektów w klasach:

  1. podczas rozruchu runtime Eclipse szuka odpowiednich adnotacji w klasach to wystąpienie.
  2. Obiekty wstrzyknięte w 1. są śledzone i zostaną ponownie wstrzyknięte po zmianie.
  3. Ręczne wyzwalanie wstrzyknięcia za pomocą ContextInjectionFactory i IEclipseContext.

To, czego chcesz, może być możliwe z trzecią opcją. Here to przykład kodu:

ManipulateModelhandler man = new ManipulateModelhandler(); 

    //inject the context into an object 
    //IEclipseContext iEclipseContext was injected into this class 
    ContextInjectionFactory.inject(man,iEclipseContext); 

    man.execute(); 

Problem jest jednak; że IEclipseContext już musi zostać wstrzyknięty do klasy, która może uzyskać dostęp do obiektu, który potrzebuje wtrysku. W zależności od liczby koniecznych zastrzyków może być bardziej użyteczne użycie delegacji (testowalność byłaby jednym argumentem).

@Inject 
    public void setFoo(Foo foo) { 
     //Bar is not attached to the e4 Application Model 
     bar.setFoo(foo); 
    } 

Dlatego lepszym rozwiązaniem jest prawdopodobnie użycie adnotacji @Creatable. Po prostu dodaj adnotację do klasy i daj jej nieargumentowy konstruktor.

@Creatable 
    public class Foo { 
     public Foo() {} 
    } 

Użycie @Inject na tym typie, jak w powyższej metodzie, pozwoli Eclipse utworzyć instancję i wstrzyknąć. Wadą jest to, że nie można już kontrolować tworzenia obiektów, tak jak w przypadku ContextInjectionFactory.inject (..).

+0

Tylko mała uwaga, że ​​większość ludzi może chcieć spojrzeć na wstrzykiwanie javax.inject.Provider do klasy zawierającej, która wymaga iniekcji instancji, jako alternatywy dla 3. –

+1

Jak można Dostaję "IEclipseContext", jeśli instrukcja 'ContextInjectionFactory.inject (man, iEclipseContext)' działa w klasie, która nie jest zdefiniowana w Modelu aplikacji? – kenshinji

+0

@kenshinji Prawdopodobnie ta [odpowiedź] (https://stackoverflow.com/questions/18316970/how-to-get-the-ieclipsecflowext-in-an-activator/33230722#33230722) pomoże. Ale ważne jest, aby podkreślić, że nie da ci to kontekst, ale raczej kontekst. Eclipse trzyma drzewo obiektów kontekstowych i to, czy jeden z nich zawiera potrzebne wartości, zależy od przypadku użycia. Być może zajrzyj także do 'E4Application.createDefaultContext()'. –

0

Odsłoniłem część e (fx) clipse, aby to osiągnąć. Spójrz na this. Przepraszamy za bezwstydną wtyczkę ...