Folks,

I completely missed this discussion when it was raised originally. Very late to 
the party now :-(

One point I can make is that it is possible for the reference(s) to be propogated using the Context and retrieved anywhere using the ComponentContext API.

Agreed, this is not as neat as using injection, but it is probably neater than creating a whole load of extra APIs of the type discussed in this email thread.

It also does require that everything is running on one thread - but if you're going to spin off extra threads for the reference calls, then you need to build your app carefully to pass over whatever context is required on the new thread.


Yours,  Mike.

On 22/09/2010 08:36, Millies, Sebastian wrote:
yes, I see. However, I still think that sometimes propagating the
references in application code can be clumsy, especially with references
to infrastructure services such as logging, which then clutter the
business interfaces.

A simpler idea might be to provide an SCAInjector utility, and do something like
SCAInjector.injectReferences(String serviceName, Object new_app_object)
after having created a new application object instance. The SCAInjector should 
be
able to discover the required implementation of the reference proxy from
the service definition in the domain and the type of the reference variable.

-- Sebastian

-----Original Message-----
From: Simon Nash [mailto:[email protected]]
Sent: Tuesday, September 21, 2010 11:52 PM
To: [email protected]
Subject: Re: Q: Best practice for making service references available
in a component?

Millies, Sebastian wrote:
Hello there,

I have an idea for a Tuscany extension. Would it not be possible to
introduce an additional attribute "package" on the
implementation.java
element, the purpose of which would be to specify all classes in
one (or more) Java package(s) as collectively making up the component
implementation. Tuscany could then inject proxies for the referenced
services at any point where the @Reference annotation is used in any
class of the packages. Similarly for @Context etc. (The value of the
"class" attribute would still denote the main class, which provides
the component's external interface.)

Would this make sense in your opinion? Would it be hard to implement?

I think it would be hard to implement because:
   1. Tuscany would need a way to enumerate all the classes in the
      package so that it could find all the @Reference annotations.
   2. Tuscany would need to discover the runtime instance relationships
      between all these application classes so that it could find the
      right instance objects on which to perform the injections.
      This is just about impossible because the "non-main" objects are
      instantiated by the application and not by Tuscany.
   3. When Tuscany creates the instance of the "main" class, the other
      application instance objects that need to be injected might not
      exist at that time.

I think the current SCA mechanisms are sufficient to allow application
classes to propagate these references to wherever they are needed, and
I think that handling such propagation is best left to application
code.

    Simon

-- Sebastian


-----Original Message-----
From: Simon Nash [mailto:[email protected]]
Sent: Tuesday, September 21, 2010 8:26 PM
To: [email protected]
Subject: Re: Q: Best practice for making service references
available
in a component?

Millies, Sebastian wrote:
Hello there,

this is a question about coding style. SCA components are coarse
grained,
i. e. the actual component implementation can consist of many
classes, only
one of which is defined as _the_ component implementation class in
the composite
XML. It is only on this class that annotations like @Reference can
be
used to
inject dependencies to other services. It is likely, however, that
the referenced
services really need to be called from one of the other classes in
the component
implementation.

How do you pass the values of these reference variables to those
ordinary Java
classes? Is there a special "SCA way" of doing this, perhaps making
these References
globally available in a component, or do you just use normal Java
programming idioms
like property setters, or constructor/method parameters?

-- Sebastian

There isn't any specific SCA way of doing this.  You can treat
the injected proxy as a regular Java object and pass it around
however you wish.  However it's useful to bear in mind that SCA
offers 3 different ways to obtain the reference proxy:
    as a constructor parameter
    as a setter parameter
    as an injected field

Depending on how you want to pass the value around, one or other
of these might be more appropriate.

    Simon



Reply via email to