Rozdily při implementaci Dependency Injection

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mesiah
Člen | 240
+
0
-

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
+
0
-

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
+
0
-

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