Rozdily při implementaci Dependency Injection

- Mesiah
 - Člen | 240
 
Ahoj,
prosím Vás, jaké jsou výhody použití ModelLoadera?
Na první pohled se mi zdá jednodužší použít:
$repository = new \CompanyRepository(new \CompanyDibiMapper($this->context->dibi));
vs.
$repository = new \CompanyRepository($this->context->dibiModel->loadModel('CompanyDibiMapper'));
					Editoval Mesiah (9. 7. 2011 2:02)

- arron
 - Člen | 464
 
Myslim, ze nikdo netvrdi, ze pouzivani DI je jednoduzsi :-) Nicmene v prvnim pripade zavadis na jednom miste dve hard-coded zavislosi (prvni na tride CompanyRepository a druhou na CompanyDibiMapper). Ve druhem pripade jenom jednu zavislost. Pak zalezi na tom, jak presne vypadaji ty tridy, jak moc to cele pujde otestovat nejakym unit testem.

- Filip Procházka
 - Moderator | 4668
 
Ty výhody jsou až trošku dál. Porovnej jak se ti zkracuje klientský kód, co služby využívá
Do containeru (přes config) si přidám DibiConnection
jako dibi
// první použití
$repository = new \CompanyRepository(new \CompanyDibiMapper($this->context->dibi));
$company = $repository->find($id);
// druhé použití
$repository = new \CompanyRepository(new \CompanyDibiMapper($this->context->dibi));
$company = $repository->find($id);
// třetí použití
$repository = new \CompanyRepository(new \CompanyDibiMapper($this->context->dibi));
$company = $repository->find($id);
// čtvrté použití
$repository = new \CompanyRepository(new \CompanyDibiMapper($this->context->dibi));
$company = $repository->find($id);
Do containeru si přidám CompanyDibiMapper, který dostane
službu dibi (nebylo by lepší dibi pojmenovat
sqldb, nebo connection?)
// první použití
$repository = new \CompanyRepository($this->context->companyMapper);
$company = $repository->find($id);
// druhé použití
$repository = new \CompanyRepository($this->context->companyMapper);
$company = $repository->find($id);
// třetí použití
$repository = new \CompanyRepository($this->context->companyMapper);
$company = $repository->find($id);
// čtvrté použití
$repository = new \CompanyRepository($this->context->companyMapper);
$company = $repository->find($id);
Přidám si do containeru i companyRepository, který dostane
službu companyMapper.
Tohle už mi přijde docela krátké na přímé použití :)
// první použití
$company = $this->context->companyRepository->find($id);
// druhé použití
$company = $this->context->companyRepository->find($id);
// třetí použití
$company = $this->context->companyRepository->find($id);
// čtvrté použití
$company = $this->context->companyRepository->find($id);
PS: nemám rád modelLoader ;)