RCP E4 Dependency Injection

lam_tr

Top Contributor
Hallo zusammen,

ich habe mal mit E4 RCP Entwicklung angefangen und finde das Verfahren mit DI ziemlich gut, leider funktioniert das bei mir noch nicht so wirklich.

Wie kann ich in einer ViewPart ein eigenes Objekt injizieren und in einer anderen View daraufzugreifen?

Ich habe es in der TableView über den IEclipseContext das Todo-Objekt injiziert.

Java:
public class TableWith {
	@Inject private Logger logger;
	@Inject private IEclipseContext context;
	private TableViewer viewer;
	
	@Inject
	public TableWith(Composite parent,@Optional IStylingEngine styleEngine) {
		viewer = new TableViewer(parent, SWT.NONE);
		viewer.setContentProvider(new ArrayContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.getTable().setHeaderVisible(true);
		viewer.getTable().setLinesVisible(true);
		
		styleEngine.setClassname(this.viewer.getControl(), "mailList");
		
		Todo todo = new Todo();
		todo.setDate(new Date());
		todo.setNote("so geht das auch!");
		context.set("myTodo", todo);
	}
	
	@PostConstruct
	public void init(){
		System.out.println("existModel1: "+context.containsKey("note"));
		logger.info("Table created!");
	}
	
	class ViewLabelProvider extends LabelProvider{
		public String getText(Object element) {
			return element.toString();
		};
	}
	
}

Und in der TreeView will ich draufzugreifen. Wieso klappt es so nicht?

Java:
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

public class Tree {

	@Inject private Logger logger;
	@Inject private IEclipseContext context;

	@Inject @Named("myTodo")Todo todo;
	
	@Inject
	public Tree(Composite parent) {
		Button button = new Button(parent, SWT.PUSH);
		button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
				false));
		button.setText("Test");
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				super.widgetSelected(e);
				System.out.println(todo.getNote());
			}
		});
		
	}
	
	@PostConstruct
	public void init(){
		logger.info("Tree created!");
	}
}

Gruss lam
 
T

Tomate_Salat

Gast
Da hier lange keine reaktion war, wage ich mal einen schuss ins Blaue.

Ich nehme mal an, dein Todo bekommst du nicht. Dieses wirst du so wohl eher nach dem Konstruktor-aufruf bekommen. Objekte die du bei der Erstellung deines anderen Objektes benötigst, solltest du über den Konstruktor injecten lassen.
 
G

Gast2

Gast
Ah hier wollte ich auch mal antworten. Für e4 Fragen würde ich parallel mal ins Eclipse E4 Forum fragen, ich denke e4 wird noch nicht so oft produktiv eingesetzt, deshalb haben wenige wirklich Ahnung davon.

Ich hab damals eine eigene Factory Injecten wollen und habe die meinem DI Container mit einem AddOn bekannt gemacht.
Ob du während der Laufzeit einfach dem EclipseContext ein Objekt geben kannst und das dann Injecten lassen kannst glaub ich nicht.

Wie kann ich in einer ViewPart ein eigenes Objekt injizieren und in einer anderen View daraufzugreifen?

Über den EventBus von E4
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast

Und das geht während der Laufzeit, in einem Part?
Also sagen wir Part A erzeugt ein Objekt legt es in den Context und Part B soll das Objekt anzeigen lassen. Dann geht das doch nicht über DI, da eventuell Part B ja schon initialisert und angezeigt wid. Dann würde ich das über Events und EventBus machen.
Auf die Art "he Part B das Objekt hast sich geändert bitte aktualiser dich."

Das zweite Problem das ich sehe ist bei dem Createable, dass das Todo Objekt nur einmal im Kontext erzeugt wird und es dann immer die gleiche Instanz bleibt, also man kann kein neues Todo Objekt erzeugen oder?
 

Sonecc

Gesperrter Benutzer
Am besten fragst du das mal vogella. Ich selbst hab leider noch nicht genug damit gearbeitet um das beantworten zu können.
 

Ähnliche Java Themen

Neue Themen


Oben