ok, i've touched multiple different topics in my post, i created 4 ticket for 
each of them so we can discuss them further separately:
https://issues.apache.org/jira/browse/SLING-3715
https://issues.apache.org/jira/browse/SLING-3716
https://issues.apache.org/jira/browse/SLING-3718
https://issues.apache.org/jira/browse/SLING-3718

stefan


>-----Original Message-----
>From: justinedel...@gmail.com [mailto:justinedel...@gmail.com] On Behalf Of
>Justin Edelson
>Sent: Monday, June 30, 2014 6:16 PM
>To: dev@sling.apache.org
>Subject: Re: [RT] Sling Models as scoped Dependency Injection Framework
>
>Hi Stefan,
>The big problem IMHO with injecting by class vs. name is that by class
>is too ambigious in many cases. For example, in AEM, it is relatively
>common to want to inject a Page object, but in fact there are two
>different page objects which come into play (currentPage and
>resourcePage) and getting the wrong one could be highly problematic.
>You are correct that things like the request and response could
>presumably be injected by class rather than by name, but the question
>then becomes how do we judge these cases? In my opinion, the bindings
>names are sensible. I personally don't find myself wanting to write
>this very often:
>
>@Inject
>private SlingHttpServletRequest somenameOtherThanRequest;
>
>The self injector is interesting. I held off on that initially because
>it seems too easy to create a circular injection. Any thoughts on how
>that can be avoided?
>
>I'm certainly open to patches which broaden the scope for constructor
>injection and @PreDestroy.
>
>Regards,
>Justin
>
>On Mon, Jun 30, 2014 at 10:13 AM, Stefan Seifert <sseif...@pro-vision.de>
>wrote:
>> in the last days we played around with Sling Models as underpinning of our
>views in a Sling+Sightly based application. it works fantastic. but during our
>experiments we detected that we were not using Sling Models for accessing
>resource content, i.e. we are not adapting resources to models to access its
>data. this is not required when using JSP or Sightly because you can access
>the properties directly. but we were using Sling Models as Dependency
>Injection frameworks for our java controller classes which are used behind the
>views, which need access to scoped objects of the current request like
>resource resolver and others. and if those controller classes need other
>business classes which depend on scope objects, we use Sling Models injection
>for them as well.
>>
>> a very simple example for illustration:
>>
>> this is a controller class behind the view:
>>
>> @Model(adaptables = SlingHttpServletRequest.class)
>> public class MyController {
>>
>>   @Inject
>>   private MyBusinessClass businessClass;
>>
>>   private String result;
>>
>>   @PostConstruct
>>   protected void activate() {
>>     result = this.businessClass.calculateTheResult();
>>   }
>>
>>   public String getResult() {
>>     return this.result;
>>   }
>>
>> }
>>
>> and this is the business classes used by the controller
>>
>> @Model(adaptables = SlingHttpServletRequest.class)
>> public class MyBusinessClass {
>>
>>   @Inject
>>   private ResourceResolver resourceResolver;
>>
>>   public String calculateTheResult() {
>>     // access resources using resource resolver
>>     return "myResult";
>>   }
>>
>> }
>>
>> effectively we can use Sling Models to navigate through a hierarchy of loose
>coupled POJOs all using DI for getting the dependencies they need - much like
>in Spring. we have already dependency injection in Felix SCR/OSGi? that's
>right, but only for OSGi services, and not for "scoped" objects depending on a
>current request or resource resolver instance.
>>
>> using the adapter concept to adapt the controller and business classes from
>the scope object they depend on (e.g. from SlingHttpServletRequest for request
>scope, from ResourceResolver if they need access to resources in context of a
>JCR user session etc.) they get all scope context objects they need, and those
>that can be adapted from them. and of course it's still possible to inject
>OSGi services as well.
>>
>> out of the box the sample displayed above will not work with Sling Models -
>a small custom injector is required:
>>
>> @Component
>> @Service
>> @Property(name = Constants.SERVICE_RANKING, intValue = 50)
>> public class SelfAdaptInjector implements Injector {
>>
>>   public String getName() {
>>     return "selfadapt";
>>   }
>>
>>   public Object getValue(Object pAdaptable, String pName, Type pType,
>AnnotatedElement pElement, DisposalCallbackRegistry pCallbackRegistry) {
>>     if (!(pType instanceof Class)) {
>>       return null;
>>     }
>>     if (!(pAdaptable instanceof Adaptable)) {
>>       return null;
>>     }
>>     return ((Adaptable)pAdaptable).adaptTo((Class<?>)pType);
>>   }
>>
>> }
>>
>> which effectively supports navigation through a graph of objects which share
>the same scope adaptable. using another custom injector which allows indirect
>adaption from SlingHttpServletRequest->ResourceResolver->CustomClass it is
>possible to have classes that can be used both in request scope, and in
>ResourceResolver-only scope as well (the latter may be a resource resolver
>instance which is opened in context of an OSGi service or event handler). this
>is already possible via "via", but i want to avoid boilerplate code as much as
>possible for much-used context objects.
>>
>> additionally all relevant "context" objects that can be derived from the
>adaptable should be supported for injection. Justin already added in SLING-
>3700 as custom injector for resource resolver, but it should support others as
>well, e.g. injecting the request, the response etc. and in my opinion this
>should be done primary using detection by class type, not by property name
>(this can be controlled already by injector ordering and custom injectors).
>>
>> if Sling is running in other context like AEM an AEM specific injector can
>ensure that AEM-typical context objects are available as well (again Justin
>has an example for this in AEM commons, although based on property names and
>not on class types).
>>
>> to be even more Spring-like and support developers with Spring background it
>would be nice to support other Spring-typical features as well, e.g.
>constructor dependency injection (currently only supported for the adaptable
>itself) and JSR-250 @PreDestroy annotation. all this should not be an big
>issue, because most infrastructure is already there in the current codebase.
>>
>> is it worth to make this a core feature for Sling Models, and propagate it
>in documentation etc.?
>>
>> WDYT?
>>
>> stefan

Reply via email to