Re: [picocontainer-dev] comments on injection

Paul Hammant <[email protected]>
Newsgroups gmane.comp.java.picocontainer.devel
Message-ID <[email protected]>
Erik, a quick response for now (more full one later) :

PicoBuilder allows for a MPC class to be passed in as "Custom  
Container" already.  Also, DPC could well be final with -

> public class MagicLocatingPicoContainer extends  
> AbstractDelegatingMutablePicoContainer {
>
>   // ctors ..
>
>   public Object getComponent(Object key) {
>
>      Object inst = delegate.getComponent(key);
>
>      if (inst == null) {
>
>          delegate.addComponent(key);
>
>          return delegate.getComponent(key)
>
>      } else {
>
>         return inst;
>
>      }
>
>   }
>
> }

On Jun 6, 2007, at 10:13 AM, Putrycz, Erik wrote:

> Of course I have few comments J:
>
> 1) ok explicit registration is lost that is true, but I’m not sure  
> if the audit is always vital. This is IMO project dependent. With  
> this feature, it is possible to have almost no setup code for pico.  
> Also what I have in my code is a @NonInstanciable annotation on  
> classes that throws an exception if such component gets registered.
>
> 2) This would work using pico usual strategies and in this case,  
> wouldn’t pico just fail? I don’t think there is any solution to  
> this. The user would have to manually handle the registrations.
>
> 3) The simple implementation I provided relies on pico’s chain of  
> CF for figuring out the DI type. But the locator is the basic API  
> that would allow customizing this behavior.
>
>
> Also somehow I think it is too early to answer 2) and 3) because  
> this will totally depend on the use cases.
>
>
> I know that this is feasible by extending pico (I had that is my  
> code before) but that’s the whole goal of the locator. I don’t  
> think that extending pico is the best way to customize the  
> behavior… It is not elegant and complex with all the different  
> constructors and child containers… also as soon as you extend it,  
> you cannot use the builder anymore. If it was up to me I’d make the  
> defaultmutablecontainer final.
>
>
> Erik.
>
> From: Paul Hammant [mailto:[email protected]]
> Sent: June 6, 2007 0:59
> To: dev-qxt/[email protected]
> Subject: Re: [picocontainer-dev] comments on injection
>
>
> Erik
>
>
> I've thought about this since you penned it.
>
>
> Inversion of Control suggests that control is good ( in a certain  
> direction).  getComponent(..) returning instances for formerly  
> unregistered components is bad for mutiple reasons:
>
>
>   1) you've lost the explicit registration step, meaning the audit  
> of what's being used is not clear
>
>   2) there recursive nature of deps ( Apple needs Banana needs  
> Orange ) can not adequately tell which constructor to use.  Should  
> it aim at the simplest (no args) or the greediest as a strategy?
>
>   3) mixing of DI types.  if a Annotation DI Apple needs Banana or  
> Orange, should they be the same injection type? or same with a  
> fallback of CDI ?
>
>
> Finally,
>
>
> The whole thing is doable without ComponentLocator changes  :
>
>
> public class MagicLocatingPicoContainer extends DefaultPicoContainer {
>
>   // ctors ..
>
>   public Object getComponent(Object key) {
>
>      Object inst = super.getComponent(key);
>
>      if (inst == null) {
>
>          addComponent(key);
>
>          return super.getComponent(key)
>
>      } else {
>
>         return inst;
>
>      }
>
>   }
>
> }
>
>
> Thoughts?
>
>
> - Paul
>
>
>
> On Jun 1, 2007, at 1:46 PM, Putrycz, Erik wrote:
>
>
>
>
> Here is another expanded testcase and more doc.
>
>
> Erik.
>
> From: Paul Hammant [mailto:[email protected]]
> Sent: June 1, 2007 16:20
> To: dev-qxt/[email protected]
> Subject: Re: [picocontainer-dev] comments on injection
>
>
> Expand that a little more with testcode will ya Erik?
>
>
> -ph
>
>
> On Jun 1, 2007, at 11:21 AM, Putrycz, Erik wrote:
>
>
> My other (main) use case is injection…
>
> When I have
>
> @Inject
>
> private MyClass _myClass;
>
>
> If MyClass is not registered then it gets registered automatically  
> in Pico. With this feature, I hardly have any “initialization” code  
> in my projects. I just start my project by creating a container and  
> everything else gets wired automatically. I’m not sure how this  
> could work out with “getInstance”.
>
>
> Erik.
>
> From: Paul Hammant [mailto:[email protected]]
> Sent: June 1, 2007 13:27
> To: dev-qxt/[email protected]
> Subject: Re: [picocontainer-dev] comments on injection
>
>
> What other usecase is there Erik ?
>
>
> For the one you;ve given :-
>
>
> +          @Test
>
> +          public void testDynamicRegistration() {
>
> +                      MutablePicoContainer pico = new  
> DefaultPicoContainer();
>
> +                      ComponentLocator dynamicReg = new  
> DynamicRegistrationLocator();
>
> +                      pico.addLocator(dynamicReg);
>
> +                      LinkedList<String> list = pico.getComponent 
> (LinkedList.class);
>
> +                      assertNotNull(list);
>
> +          }
>
>
>
> I might prefer ..
>
>
> +          @Test
>
> +          public void testDynamicRegistration() {
>
> +                      MutablePicoContainer pico = new  
> DefaultPicoContainer();
>
> +                      LinkedList<String> list = pico.addComponent 
> (LinkedList.class).getInstance();  // getInstance() is new and  
> implicitly on the last component added ~  v easy to implement
>
> +                      assertNotNull(list);
>
> +          }
>
>
> I know you have a 'bigger' use of your way up your sleeve :-)
>
>
> - Paul
>
>
> On Jun 1, 2007, at 9:46 AM, Putrycz, Erik wrote:
>
>
> <Pico2-locator.patch>
>
>
>
>
> <Pico2-locator.patch>
>
> ---------------------------------------------------------------------
>
> To unsubscribe from this list please visit:
>
>
>     http://xircles.codehaus.org/manage_email
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.