DI a izolace pomocí „modulů“
- Honza Kuchař
- Člen | 1662
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
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 | 100
@HonzaKuchař mě se to zamlouvá, ale zatím jsem tímto směrem moc neuvažoval.
- Marek Bartoš
- Nette Blogger | 1274
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
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
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
- Přednáška na posobotě související s tímto tématem
- implementace integrace více DI v nette/di
Editoval Honza Kuchař (30. 10. 2019 16:03)
- Honza Kuchař
- Člen | 1662
Víte o někom, kdo řeší/řešil „moduly“ v PHP? Prosím označte ho/ji zde. Děkuji.