Eclipse 4.0: Inject your OWN Objects
Join the DZone community and get the full member experience.
Join For FreeOne of the great new features of Eclipse 4.0 is the use of dependency injection (DI). The new architecture does not use Singletons at all, but injects all the necessary objects in a given context. For example, a view is a POJO now and the necessary parent composite is injected:
public class ContactView implements IContactView {
@Inject
public ContactView(Composite parent) {
...
But how could you use DI to inject your own objects? It’s easy and straight forward: Just annotate the object (A) that needs your own object (B) injected with @Inject, either on attribute or on method level. The nice thing about this is that all available injectable objects (e.g. from the context) will automatically injected into (B). As an example, you could create a presenter that is not interested in UI toolkit (e.g. SWT) specific stuff but needs a view (that is interested in the SWT parent composite).
public class ContactPresenter {
public interface IContactView {
...
}
private IContactView contactView;
@Inject
public ContactPresenter(ContactView contactView) {
....
The flaw in this example is: the presenter gets a concrete ContactView object rather than an IContactView interface injected. The easiest way for getting around this is to introduce a little factory that gets a concrete object injected and returns the desired interface:
public class ContactViewFactory {
@Inject
ContactView contactView;
public IContactView getContactView() {
return contactView;
}
}
Now the presenter just lets the factory be injected and gets the IContactView interface:
private IContactView contactView;
@Inject
public ContactPresenter(ContactViewFactory contactViewFactory) {
contactView = contactViewFactory.getContactView();
Another way would be to provide an OSGi declarative service that registers a class for a given interface with the ContextInjectionFactory. This is how the services like the selection service are registered. Right now, I could not get this working (inject a ContactView to a needed IContactView), but as soon as I find out why or how, I’ll blog about it.
If you want to check out example code from cvs, take a look at the classes DetailsView and DetailComposite in the e4 contacts demo (host: dev.eclipse.org, repository path: /cvsroot/eclipse, user:anonymous, path to bundle: e4/org.eclipse.e4.ui/examples/org.eclipse.e4.demo.contacts).
Opinions expressed by DZone contributors are their own.
Comments