Hi Thomas.
On 22-Feb-2011, at 7:18 AM, Thomas Kratz wrote:
> My next question is: at Login time I do load a User Object graph with some
> rights stuff in Collections (Its a pojo). How would I provide this Object
> through the EclipseContext so I can get it injected in my views/editors?
The approach I use is to use an OSGi service that acts as a creation function.
The service first checks for a known value and if set, simply returns that
value. Otherwise it populates the item and sets the value in the context. I
make the object available under its class and interface names. (I defined OSGi
services for the "well-known" interface names too that simply use this same
creation function.)
public class RepositoryCreationFunction extends ContextFunction {
protected static final String REPOSITORY = "kizby.repository"; //
$NON-NLS-1$
@Inject protected MApplication app;
@Override
public Object compute(IEclipseContext context) {
if(context.get(REPOSITORY) != null) { return context.get(REPOSITORY); }
Repository repo = openRepo(context);
assert repo != null;
context.set(REPOSITORY, repo);
context.set(repo.getClass().getName(), repo);
registerInterfaces(context, repo.getClass().getInterfaces(), repo);
return repo;
}
private void registerInterfaces(IEclipseContext context,
Class<?>[] clazzes, RepositoryFacade facade) {
for(Class<?> intf : clazzes) {
context.set(intf.getName(), facade);
registerInterfaces(context, intf.getInterfaces(), facade);
}
}
private Repository openRepo(IEclipseContext context) {
//...
}
}
I define the service like the following:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
name="ca.mt.kizby.repository.facade">
<implementation class="ca.mt.kizby.ui.e4.RepositoryCreationFunction"/>
<service>
<provide interface="org.eclipse.e4.core.contexts.IContextFunction"/>
</service>
<property name="service.context.key" type="String"
value="ca.mt.kizby.core.Repository" />
</scr:component>
Consumers simply specify an injectable instance of Repository.
> Next question is: I do use some services in my EditorInputs (they are lazyly
> fetching content from the backend). I think to get the services injected
> there I would need to do some stuff. I have a central extensible factory
> where the inputs get created, could I use the DenedencyInjector at this time
> to get my services there ?
If you can get ahold of an IEclipseContext, you can use
org.eclipse.e4.core.contexts.ContextInjectionFactory to either create an object
or inject into an existing object. Beware that if you #inject, you are
responsible for calling #uninject.
Hope that helps.
Brian.
--
Rescue your task list with Kizby! Free 30 day trial with no obligations.
Visit kizby.com for details.
_______________________________________________
e4-dev mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/e4-dev