Proč továrničky v DI Containeru neumí tagy?

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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ě.

Honza Marek
Člen | 1664
+
0
-

<ot>Co to je továrnička v Nette DI?</ot>

Filip Procházka
Moderator | 4668
+
0
-

Továrny jsou tohle Honzo a takto je používám.

David Grudl
founder | 8310
+
0
-

Honza Marek napsal(a):

Nonshared services v řeči tvého kmene ;-)

David Grudl
founder | 8310
+
0
-

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
founder | 8310
+
0
-

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
+
0
-

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 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.

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ěď.

RSS tématu Téma zavřeno