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

Reply via email to