DI a izolace pomocí „modulů“

Honza Kuchař
Člen | 1662
+
+8
-

Používáme více DI kontejnerů pro rozdělení zodpovědností do různých částí aplikace. Je to skvělé! Zkuste to také.

Moduly

Přemýšlím však na tím, že by bylo opravdu praktické mít možnost kontejner rozdělit na menší části i uvnitř.

Toto rozdělení nemusí být neprůstřelné. Spíš aby výchozím chováním vedlo k vytváření menších soběstačných aplikačních celků s jasně definovaný veřejným rozhraním (exportované služby) a závislostmi (služby vyžadované z jiných modulů).

V podstatě uvažuji nad kontextovým autowiringem. Pokud si v modulu A zapnu autowiring služby ArticlesTable, nechci aby mi na ni jiný modul sahal. Uvnitř modulu však chci mít možnost ji použít bezbolestně. Není důvod, proč bych u služeb uvnitř modulu měl o tuto tabulku explicitně žádat zapisováním názvu služby na všech místech, kde ji použiji. Stejně tak, chci říct, že z tohoto modulu exportuji ArticlesFacade, kterou poté mohu používat v prezenterech.

Co je to modul?

PHP nic takového nezná. Mohlo by se však za modul prohlásit namespace root (tj. i všechny jeho potomci).

Každý modul by potom mohl mít container.neon, který může includovat další .neon definice – ty by tímto automaticky padly pod modul.

Jak to máte vy?

Používáte něco podobného? Podělte se prosím odpovědí níže.

Editoval Honza Kuchař (2. 10. 2019 22:57)

Honza Kuchař
Člen | 1662
+
0
-

Používáte něco podobného? Stojíte o rozdělení aplikace na moduly? Podělte se prosím odpovědí níže.

@DavidGrudl @jiripudil @VáclavPávek @DavidMatějka Děkuji moc za +1, potřebuji však odpověď na citovanou otázku. 😉

Václav Pávek
Backer | 99
+
0
-

@HonzaKuchař mě se to zamlouvá, ale zatím jsem tímto směrem moc neuvažoval.

Marek Bartoš
Nette Blogger | 1239
+
0
-

Máš konkrétní případ, kdy se kontextový autowiring opravdu hodí? Přijde mi snazší autowiring služby prostě vypnout a explicitně ji předat přes název, kam potřebuji. Z práce s více DI kontejnery vzniká spousta komplikací.

Honza Kuchař
Člen | 1662
+
0
-

Máš konkrétní případ, kdy se kontextový autowiring opravdu hodí?

Viz výše. Právě zmíněné soběstačné aplikační celky. Například koherentní část modelu.

Přijde mi snazší autowiring služby prostě vypnout a explicitně ji předat přes název, kam potřebuji.

Ano. To se vůbec nevylučuje s kontextovým autowiringem.

Problém je však v tom, že tu je bolestivé předávat službu i uvnitř „modulu“. Závislost snadněji unikne ven, protože klade stejný odpor pro napojení uvnitř modulu i vně. (ref: Physics of software, friction)

Z práce s více DI kontejnery vzniká spousta komplikací.

Toto je úplně jiná věc, na našem GitHubu je to vysvětleno. S kontextovým autowiringem nijak nesouvisí.

Editoval Honza Kuchař (2. 10. 2019 22:52)

Honza Kuchař
Člen | 1662
+
0
-

Redukuji tedy otázku na následující:

Používáte něco podobného?

Jak udržujete pořádek v závislostech jednotlivých částí vaší aplikace?

(nástroje jako dePHPend nebo deptrac to částečně řešení, nicméně řešení na úrovni DI kontejneru mi nepřijde o nic méně elegantní)

Honza Kuchař
Člen | 1662
+
+3
-

Editoval Honza Kuchař (30. 10. 2019 16:03)

Honza Kuchař
Člen | 1662
+
0
-

Víte o někom, kdo řeší/řešil „moduly“ v PHP? Prosím označte ho/ji zde. Děkuji.