Autor | Zpráva | ||
---|---|---|---|
midlan Profil |
Ahoj.
Postupně jsem začal přicházet na kouzlo dependecy injection a zalíbilo se mi tak, že ho nasazuji úplně všude. Jen jsem teď narazil na problém, Nevím jak předat kofigurační údaje mysql, smpt apod. abych neporušil dependency injection. Nejradši bych je měl uložené někde v externích konfiguračních souborech, ale nenapdá mě jak to skloubit s dependecy injection. Věděl by někdo? Díky. Moderátor Majkl578: Titulek „dependency injection“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
|
||
Majkl578 Profil |
#2 · Zasláno: 9. 4. 2013, 22:09:42
midlan:
„ale nenapdá mě jak to skloubit s dependecy injection“ Poměrně jednoduše. Konfiguraci předáš objektu konstruktorem. |
||
midlan Profil |
#3 · Zasláno: 9. 4. 2013, 22:33:38
Majkl578:
ale to už nebudou v externím souboru... |
||
Jan Tvrdík Profil |
#4 · Zasláno: 9. 4. 2013, 22:50:05
midlan:
Nic ti nebrání je do externího souboru umístit a composition rootu je z něj načíst. |
||
Majkl578 Profil |
#5 · Zasláno: 9. 4. 2013, 22:52:31
Proč by nemohly být?
Není přeci důležité, jak a odkud konfigurace pochází. Důležité je, že v moment, kdy to bude potřeba, budou dostupné. Pokud znáš Nette Framework, tam se toto samozřejmě řeší také pomocí konfiguračních souborů. V určitou chvíli dojde k načtení konfigurace a k následnému sestavení objektového grafu (v tzv. composition rootu aplikace), kdy se každá služba vytvoří na základě v konfiguraci nadefinovaných pravidel. Pokud chceš používat dependency injection, velmi doporučuji podívat se na nějaký kvalitní framework, který tuto techniku používá, ať už zmíněné Nette nebo Symfony. Každopádně doporučuji podívat se do dokumentace Nette, alespoň pro inspiraci, jak to lze řešit: Konfigurace a Dependency Injection. |
||
midlan Profil |
#6 · Zasláno: 9. 4. 2013, 23:41:36
Jan Tvrdík:
Moc nechápu ten composition root, mohl byste mi to trochu objasnit? Majkl578: „Není přeci důležité, jak a odkud konfigurace pochází. Důležité je, že v moment, kdy to bude potřeba, budou dostupné.“ Není tohle náhodou přesný opak dependency injection? Při správném dependecy injection by mělo být i nezasvěceným jasné kde se data berou. „composition rootu“ Jak píšeu výše tohle nechápu. „Každopádně doporučuji podívat se do dokumentace Nette, alespoň pro inspiraci, jak to lze řešit: Konfigurace a Dependency Injection.“ Nette nepoužívám, ale ten článek o DI jsem četl už předtím. V tom článku konfigurace moc nevidím řešení mého problému. |
||
Jan Tvrdík Profil |
midlan:
„Moc nechápu ten composition root, mohl byste mi to trochu objasnit?“ Používáš-li nějaký DI container, tak je to místo, kde je tento DI container sestaven. Pro jednoduchost budu předpokládat použití triviální DI containeru – Pimple. // Composition root start $container = new Pimple(); $container['db_params'] = json_decode(file_get_contents('db_params.json')); // konfigurace v externím souboru $container['db_connection'] = function ($c) { return new mysqli($c['db_params']->host, $c['db_params']->user, $c['db_params']->password, $c['db_params']->database); }; $container['app'] = function ($c) { return new App($c['db_connection']); }; // Composition root end $container['app']->start(); Nepoužíváš-li DI container, tak je to místo, kde ručně sestavuješ objektový graf závislostí. // Composition root start $dbParams = json_decode(file_get_contents('db_params.json')); // konfigurace v externím souboru; $dbConnection = new mysqli($dbParams->host, $dbParams->user, $dbParams->password, $dbParams->database); $app = new App($dbConnection); // Composition root end $app->start(); Všimni si, že composition root je jediné místo v aplikaci, kde je z hlediska DI v pořádku vytvářet nové instance pomocí new a používat DI container.
|
||
Časová prodleva: 7 dní
|
|||
midlan Profil |
#8 · Zasláno: 16. 4. 2013, 13:05:01
Jan Tvrdík:
Omlouvám se za odmlku a děkuji za vysvětlení, už to chápu :) |
||
Časová prodleva: 12 let
|
0