You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by "Andrew C. Oliver" <ac...@apache.org> on 2002/11/15 22:52:30 UTC

Re: avalon newbie: Innocent question, please don't hurt me -- services strategy with Avalon framework

I'm not buying it until you point me to a real project that is a good 
example of this done right and that hasn't suffered from excess 
complexity.  Then I'll buy it ;-)

-Andy

Stephen McConnell wrote:

>
>
> Andrew C. Oliver wrote:
>
> > Okay so you've hooked me.
>
>
>
> :-)
>
> > Show me a set of code that you regard as WELL designed and
> > UNDERSTANDABLE (which means maintainable over time as well).  My
> > biggest problem with the approach you suggest is the only examples I
> > have of code that was done in that way I seriously seriously seriously
> > dislike.  I also have a gripe against excessive "is a" relationships
> > but putting that aside.  Point me to something that was done well that
> > uses the framework in the manner you suggest.
>
>
>
> All of the containers in Avalon (Merlin, Fortress, Phoenix) have been
> built the patterns I've described.  But I don't think that's a good
> solution in terms of pointing you to something because it will be really
> easy to get mixed up about things because you will be looking at
> component based systems proving component management.
> There are examples of Phoneix components that follow this pattern in the
> cornerstone package, and the james is an example of a system based on
> the composition of components - but you should probably post an email to
> the Phoenix list to get suggestions on which of these components you
> should be looking at.
>
> I have a lot of stuff I'm working on that's internal that meets your
> criteria.  But to get to this position I've had to build the container
> API to provide the proper seperation of container-side verus component
> concerns.  I'm not saying there isn't well designed and understandable
> systems out there based on Avalon, but I do think that these examples
> will be of limited complexity.  Without these sort of container-side
> service abstractions the code in a complex system starts to get
> complicated with component management artifacts - in other words -
> things get cluttered and unnecessarily complicated.  Based on the work
> with excalibur/assembly, meta, container, configuration, I've managed to
> substantially simplify my code base and get a big application under
> control and readily understandable.
>
> Cheers, Steve.
>
> >
> >
> > -andy
> >
> > Stephen McConnell wrote:
> >
> >>
> >>
> >> Andrew C. Oliver wrote:
> >>
> >> > Some time ago someone sent me some ideas on how to use avalon in a
> >> > service based strategy such that it would be more containment based
> >> > than inheritance based (and bare will me that I regard interface
> >> > implementation as inheritance because its "is a" not "has a").
> >> > Basically, I don't want everything to implement 10 different
> >> > interfaces.  i'd rather null operations...  So I lost the message
> >> > (long story short, fired, lost laptop, rehired by same company in
> >> > different group, new laptop...stupid mozilla default settings had
> >> > deleted mail of my server against my will).. But I'm ready to do it
> >> > now ;-)
> >> >
> >> > What I basically want is:
> >> >
> >> > public class AbstractService implements x, y, z, ... {
> >> >
> >> > ??
> >> >
> >> > public SomeType someLifecycleMethodImNotUsing() {
> >> >   return null;
> >> > }
> >> >
> >> > }
> >> >
> >> > What are the x, y, and zs that I should most likely use?
> >>
> >>
> >> Probably:
> >>
> >>   LogEnabled,
> >>   Initializable,
> >>   Disposable
> >>
> >> But if you wanted to do the grand abstract approach, you could do
> >> something like:
> >>
> >>   LogEnabled,
> >>   Serviceable,
> >>   Contextualizable,
> >>   Configurable,
> >>   Initializable,
> >>   Startable,
> >>   Disposable
> >>
> >> But I also think it is bad approach.  I'll explain why.
> >> Creation of abstract class is something that makes sence when the
> >> underlying functionality is "rich".  That isn't the case with any 
> of the
> >> above - as you will have seen from Leo's email you just end up with an
> >> object holding a bunch of state members.  What's missing is the
> >> relationship between that object and its container.  All of the above
> >> interface provide the formal points of inteaction between a container
> >> and a component.
> >>
> >>   LogEnabled
> >>
> >>      assignment of the logging channel that
> >>      the component will use (component does
> >>      not see any particular logging implemetation)
> >>
> >>   Serviceable
> >>
> >>      assignment of the services that the compoent
> >>      needs to function to do its job (component
> >>      should never need to go hunting for the service
> >>      it neeeds) - service that the component needs
> >>      would typically be declared as depedencies in
> >>      a meta declaration and the container will take
> >>      care of service provisioning
> >>
> >>   Contextualizable
> >>
> >>      supply of the runtime context - again, the
> >>      context information that the component needs
> >>      (key + type) can be declared in meta info so
> >>      a container can make sure the component gets
> >>      all of the context information it needs
> >>
> >>   Configurable
> >>
> >>      supply of the component configuration by the
> >>      to the component.
> >>
> >>   Initialiable
> >>
> >>       request from the container to the component
> >>       to initialize itself, typically the
> >>       component implemetation will validate internal
> >>       state at this point
> >>
> >>   Startable
> >>
> >>       only applicable in the case of a component that
> >>       needss to start up its own thread of execution
> >>       (i.e. a component acting as a server for example)
> >>       - called by the container to instruct the component
> >>       to start or stop doing its stuff
> >>
> >>   Disposable
> >>
> >>       Used by a container to tell the compoent to clean
> >>       up state
> >>
> >> Problem with the "AbstractService" approach is the abstract work should
> >> be in the container, not in the component.  It the container that 
> has to
> >> take care of doing all of the leg work to make sure the component gets
> >> everything it needs.  It does this based on a combination of (a)
> >> lifecycle interfaces as described above, and (b) supplimentary meta
> >> information describing the component deployment criteria.
> >>
> >> By pushing all of the overhead onto the container, you end up with much
> >> better code in you component implemetation, and much less code.
> >>
> >>
> >> > And what else do I need?
> >>
> >>
> >>
> >> 1. a container
> >> 2. a component / service model (design)
> >>
> >> >
> >> > In short my application is a reporting service which lets me pull 
> from
> >> > a number of data sources, execute various transformations and get out
> >> > a report via various delivery methods.  So I have DataProviderService
> >> > which has for instance a JDBCService which can process QueryDefs to
> >> > get stuff from a database (I don't ermember the names I have thus
> >> > far).  So far I've stubbed most things out and I'm fairly happy with
> >> > it, but I'd rather not re-invent the wheel, hence my interest in 
> using
> >> > Avalon in place of the little "Service" and "ServiceManager" 
> classes I
> >> > used as placeholders..
> >> >
> >> > Thoughts?
> >>
> >>
> >>
> >> Doing cause-grained component oriented development is an approach that
> >> lets you break apart systems more formally, and from that, the overall
> >> system (a set of assembled components) becomes much, much simpler to
> >> build.  In fact, combining the Avalon component model with meta
> >> information enables the automation of system assembly and deployment.
> >>
> >> Cheers, Steve.
> >>
> >> >
> >> > thanks,
> >> >
> >> > Andy
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > To unsubscribe, e-mail:
> >> >
> >> > For additional commands, e-mail:
> >> >
> >> >
> >> >
> >> >
> >>
> >
> >
> >
> >
> > --
> > To unsubscribe, e-mail:
> >
> > For additional commands, e-mail:
> >
> >
> >
> >
>




--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>