[TYPO3-50-general] Improvment for Injections?!?

Robert Lemke robert at typo3.org
Mon Jan 12 08:26:32 CET 2009


Hi Malte,

Am 11.01.2009 um 19:46 schrieb Malte Jansen:

> it would be nice get some feedback...
> Bad idea? Not possible? Perhaps later? We working on it ;) ?

sorry, forgot about this thread.

> Malte Jansen schrieb:
>> Hi,
>>
>> I just tested the AOP and discovered, if you just use an aspect for
>> injecting a class.
>>
>> So what about some injecting the Classes via a DocComment-Tag-Syntax?
>> e.g.
>> @inject $objectFactory F3::FLOW3::Object::FactoryInterface
>> @inject property F3::MyPackage::MyClassInterface
>>
>> There is no autocompleting, but the outline of a class has less  
>> entries
>> and injecting something is more or less more an AOP-aspect, than
>> belonging to a model.
>>
>> And if you want to test a class, you can use the old-fashioned-syntax
>> (implemented somehow as aspect):
>> public function  
>> injectObjectFactory(F3::FLOW3::Object::FactoryInterface
>> $objectFactory);
>>


Although it sounds tempting, there are a few issues with this solution:

  1. Readibility / Black Magic

     All code a class uses internally should actually be found in the  
class
     itself (or one of the parent classes). It would be too much magic  
if
     the class code referred to $this->objectFactory but there is no  
such
     property defined and no method which fills that property.

     Cross-cutting concerns, which are extracted by AOP, are a  
different thing:
     Although they introduce new functionality, the target class does  
not refer
     to it - it doesn't even know about it.

     Although it could be argued that annotations are well enough  
readable for
     this mechanism, injection of dependencies is simply not a cross- 
cutting
     concern but an important part of the class construction.

  2. Loss of contract

     No matter if your class implements an interface or not, third  
party code
     will rely on the set of public functions your class provides. If  
this
     code wants to call an inject method (or a regular setter), it  
doesn't
     know for sure if it exists.

  3. Testing

     Most importantly, tests should always work without the AOP  
framework, because
     only this guarantees that you're testing the code you want (and  
not the woven-in
     functionality). You write:

>> And if you want to test a class, you can use the old-fashioned-syntax

     You always want to test a class of course, therefore you always  
would have to
     use the old-fashioned syntax.

The basic idea you had is not wrong though, it surely would be nice to  
simplify
setter injection. A cleaner but still not clean approach would be to  
declare
public properties which are then automatically filled from outside:

    /**
     * @var F3\FLOW3\Object\Factory\Interface
     */
    public $objectFactory;

But I never really liked that solution because it conflicts with our  
rule of not
having public properties at all.

So, I'd say, for the time being it's nothing I'd like to see support  
for in FLOW3.

Cheers,
robert



More information about the TYPO3-project-5_0-general mailing list