Proč továrničky v DI Containeru neumí tagy?
- Filip Procházka
- Moderator | 4668
Zde je explicitně zakázáno, aby v configu šly nastavit tagy pro továrničky
Proč to tak je? Nešlo by toto omezení zrušit? Tagy se mi hodí i u továrniček.
- Patrik Votoček
- Člen | 2221
Taky by se mě hodilo kdybych si mohl vytáhnout jména všech továrniček podle tagu.
Nicméně vidím v tom trochu WTF. Pokud by jsi totiž stejný tag použil jak u továrničky tak u klasické služby a pak si vytáhnul jejich názvy. Tak ti to jaksi vytáhne obojí a nezjistíš co je co. Takže pokud by se to dělalo tak by se to muselo udělat odděleně.
- David Grudl
- Nette Core | 8229
Ta nepodpora tagů nebyla záměrná, ale faktem je, jak píše Patrik, mělo by to WTF efekt.
Nicméně stejně jsem chtěl přidat možnost vytáhnout si továrnu jako službu, tj. jako objekt callback. Továrna by pak šla předat dál, skvěle by to rozšířilo schopnosti lazy-loadingu, které jsou s klasickým DI tristní.
Takže pokud budeme mít továrnu databaseConnection
(tedy
metodu createDatabaseConnection
), bude možné pracovat i se
službou databaseConnection
, kamkoliv ji předat a pak jen
zavolat:
$connection = $container->databaseConnection->invoke(...);
Ale nelíbila se mi na tom jedna věc: názvosloví.
databaseConnection
neevokuje, že jde o továrnu. Tak jsem to
zatím odložil.
- David Grudl
- Nette Core | 8229
Experimentálně jsem to zkusil
vyřešit vytvářením služeb s postfixem Factory
(databaseConnectionFactory
), tagy se jim předávají.
(teoreticky taková věc mohla existovat pro jakoukoliv službu, možná jako
$container->getFactory($service)
.)
- Vyki
- Člen | 388
David Grudl napsal(a):
Nicméně stejně jsem chtěl přidat možnost vytáhnout si továrnu jako službu, tj. jako objekt callback. Továrna by pak šla předat dál, skvěle by to rozšířilo schopnosti lazy-loadingu, které jsou s klasickým DI tristní.
Takže pokud budeme mít továrnu
databaseConnection
(tedy metoducreateDatabaseConnection
), bude možné pracovat i se služboudatabaseConnection
, kamkoliv ji předat a pak jen zavolat:$connection = $container->databaseConnection->invoke(...);
Ale nelíbila se mi na tom jedna věc: názvosloví.
databaseConnection
neevokuje, že jde o továrnu. Tak jsem to zatím odložil.
Chtěl jsem se zeptat jestli už je tato věc implementována, respektive jestli existuje způsob jak si z DI továrničku vytáhnout a předat jako callback? Díky za odpověď.