[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [e4-dev] More Questions about DI
|
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.