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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
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
Nette Core | 8218
+
0
-

Honza Marek napsal(a):

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

David Grudl
Nette Core | 8218
+
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
Nette Core | 8218
+
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ěď.