wiem z trzech sposobów jak Eclipse 4 można wstrzykiwać obiektów w klasach:
- podczas rozruchu runtime Eclipse szuka odpowiednich adnotacji w klasach to wystąpienie.
- Obiekty wstrzyknięte w 1. są śledzone i zostaną ponownie wstrzyknięte po zmianie.
- 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 (..).
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. –
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
@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()'. –