Dependency Injection ve 2.1: lokální autowiring

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

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

enumag
Člen | 2118
+
0
-

+1 Přesně tohle mne už napadlo když jsem psal jedno extension.

Filip Procházka
Moderator | 4668
+
0
-

Již teď konvenci dodržuji, takže by to pro mě bylo velice příjemné zjednodušení práce.

Honza Marek
Člen | 1664
+
0
-

Nevím, jestli to nepovede k chybám, které by původní striktnější chování odhalilo.

pekelnik
Člen | 462
+
0
-

Připadá mi to jako dobrý nápad… v současnosti používám jmennou konvenci kdy jednotlivé sety prefixuji ale je s tím víc práce.

enumag
Člen | 2118
+
0
-

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