[TYPO3-50-general] Upcoming commit: Big change in the component manager
Robert Lemke
robert at typo3.org
Tue Jul 22 09:37:53 CEST 2008
Hi folks,
there's a bit commit I currently working on which contains an
important change in the component manager.
The point is this: As you know, the best way to get instances of
_Singleton_ components is using
Dependency Injection - either constructor or setter injection. That's
a great way to conveniently
get an instance of the desired component and still keep your class
decoupled from the framework.
However, you sometimes need prototypes too. For example would you like
to create a new Comment object
in your controller once a blog visitor wants to comment a blog entry.
For these cases we have two options:
a) call the component manager's getComponent() method
b) use method injection by writing an abstract factory method
Since the last T3DD I have been thinking a lot about option b). I
won't go into details here but the
result was that it has too many disadvantages, so I dropped the idea.
Option a) is generally okay, but the problem is that now many many
classes actually need a reference
to the component manager. If you want to test such a class you'll want
to mock the component manager
which is at times a bit difficult because it has some many methods.
Therefore I decided to extract the getComponent() method from the
component manager and put it into
its own class, the Component Factory. The average class will, in the
future, only need the Component
Factory and doesn't care about the advanced functions of the Component
Manager. And the factory will
only contain the getComponent() method - which is extremely easy to
mock.
Last night I started refactoring all packages of the TYPO3 v5
distribution and I'll continue this
morning. At some point I will commit the changes and then all code
which was not part of the distribution
will need to be checked. So, what you'll need to do is _manually_
looking at each place where you
refer to the Component Manager and see if you really need the
Component Manager's functions or only
the getComponent() method and inject the Factory in the latter case.
Finally let me tell you how glad I am that we have so many unit tests.
Otherwise these kinds of
refactoring would hardly be possible ...
Cheers,
robert
More information about the TYPO3-project-5_0-general
mailing list