Dependency Injection ve 2.1: lokální autowiring
- David Grudl
- Nette Core | 8227
(Navazuji na starší příspěvek)
Za nejlepší a nejdůležitější vlastnost DI kontejneru považuji autowiring. Vlastně bez něj by mi ani moc nedával smysl. Existují případy, kdy se bohužel nedá využít, a tohle bych rád napravil.
Příkladem mohou být databáze, když jich v konfiguraci nadefinujeme více. Každá databáze představuje několik objektů (connection, reflection, panel, …), říkejme jim sada. Pochopitelně je třeba, aby vždycky byly spolu propojeny objekty z jedné sady. Při použití autowiringu by ale došlo k nechtěnému propojení s objekty z výchozí sady (což je první databáze v pořadí).
Řešením je lokální autowiring. Zkrátka primárně se použijí objekty z aktuální sady a teprve když takové nejsou, šáhne se po globálním autowiringu.
Otázkou je, jak definovat onu sadu. Buď nějakým
ServiceDefinition->setSet(...)
a set: ...
v konfiguraci, nebo mě napadlo vycházet přímo z názvu služby. Pokud se
například služba jmenuje nette.database.default.connection
,
tvořily by sadu všechny služby, jejichž prefix by byl taky
nette.database.default.
.
- Filip Procházka
- Moderator | 4668
Již teď konvenci dodržuji, takže by to pro mě bylo velice příjemné zjednodušení práce.
- Honza Marek
- Člen | 1664
Nevím, jestli to nepovede k chybám, které by původní striktnější chování odhalilo.
- enumag
- Člen | 2118
Ještě zrovna u té databáze mne napadla jiná možnost. Po rozdělení Nette bude DatabaseExtension samostatné, a napadlo mne tedy, že by DatabaseExtension mohlo pracovat s pouze jednou databází. V případě, že by bylo potřeba více databází, by si uživatel v configu to extension zaregistroval vícekrát (samozřejmě by se musel nějak vyřešit autowiring pouze pro první instanci).