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