所以 - 我想将我的代码切换到依赖注入,依赖注入容器(DIC)范例。我一直在阅读...它似乎对我来说,我一直在做这一切......也许......PHP依赖注入。我的代码实际上是依赖注入容器吗?
我在做什么 - 我正在创建名称空间类(容器? ),我通常会调用Api,为每个单独的项目,然后实例化并从中获取已配置的对象。实际示例:
<?php
/**
* @namespace
*/
namespace SomeNamespace;
/**
* api
*/
class api {
public function __construct() {
/*
* Requiring all of the common files.
*/
require_once(VENDORS_PATH . DIRECTORY_SEPARATOR . 'PHPMailer' . DIRECTORY_SEPARATOR . 'class.phpmailer.php');
require_once(VENDORS_PATH . DIRECTORY_SEPARATOR . 'PHPMailer' . DIRECTORY_SEPARATOR . 'class.smtp.php');
}
private function getPostgresqlPreprocessor() {
$spp = new \SomeNamespace\Utils\PostgresSearchPreProcessor();
$settingsService = $this->getSettingsService();
$settings = $settingsService->readSettings();
$spp->setValidator(new \Auro\Validation\Validator())
->setSettings($settings)
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'));
return $spp;
}
public function getDalApi() {
return new \DalServices\Api();
}
public function getFeedsService() {
$fc = \Auro\Mvc\Front::getInstance();
$feedsService = new \SomeNamespace\Feeds();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'feeds');
$feedsService
->setDalApi(new \DalServices\Api())
->setSomeNamespaceApi($this)
->setResponse($fc->getResponse())
->setPaginator(new \Auro\View\Paginator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_feeds_config.php'))
->setCams(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'webcams.php'))
->setRenderer($renderer);
return $feedsService;
}
public function getSettingsService() {
$fc = \Auro\Mvc\Front::getInstance();
$settingsService = new \SomeNamespace\Settings;
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'settings');
$settingsService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'))
->setDalApi(new \DalServices\Api())
->setResponse($fc->getResponse())
->setRenderer($renderer);
return $settingsService;
}
public function getUsersService() {
$fc = \Auro\Mvc\Front::getInstance();
$usersService = new \SomeNamespace\Users();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'users');
$usersService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'))
->setAvailableCurrencies(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'currencies.php'))
->setLanguages(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'languages.php'))
->setPostgersqlPreprocessor($this->getPostgresqlPreprocessor())
->setResponse($fc->getResponse())
->setDalApi(new \DalServices\Api())
->setRenderer($renderer);
return $usersService;
}
public function getVrcommentsService() {
$fc = \Auro\Mvc\Front::getInstance();
$vrcommentsService = new \SomeNamespace\Vrcomments();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'vrcomments');
$vrcommentsService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'))
->setPostgersqlPreprocessor($this->getPostgresqlPreprocessor())
->setPaginator(new \Auro\View\Paginator())
->setResponse($fc->getResponse())
->setDalApi(new \DalServices\Api())
->setRenderer($renderer);
return $vrcommentsService;
}
public function getVrentalsService() {
$fc = \Auro\Mvc\Front::getInstance();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'vrentals');
$vrentalsService = new \SomeNamespace\Vrentals();
$vrentalsService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'))
->setPostgersqlPreprocessor($this->getPostgresqlPreprocessor())
->setPaginator(new \Auro\View\Paginator())
->setDalApi(new \DalServices\Api())
->setRenderer($renderer)
->setResponse($fc->getResponse())
->setMailConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_mail.php'))
->setMailer(new \PHPMailer(true));
return $vrentalsService;
}
public function getNoAikService() {
$fc = \Auro\Mvc\Front::getInstance();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'noaik');
$AikService = new \SomeNamespace\Noaik();
$noAikService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_config.php'))
->setPostgersqlPreprocessor($this->getPostgresqlPreprocessor())
->setPaginator(new \Auro\View\Paginator())
->setResponse($fc->getResponse())
->setDalApi(new \DalServices\Api())
->setRenderer($renderer)
->setMailConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_craig_mail.php'))
->setMailer(new \PHPMailer(true));
return $noAikService;
}
public function getTotalauthService() {
$fc = \Auro\Mvc\Front::getInstance();
$renderer = new \Auro\View\Renderer();
$renderer->setBasePath(VIEWS_PATH . DIRECTORY_SEPARATOR . 'totalauth');
$totalauthService = new \SomeNamespace\Totalauth();
$totalauthService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setRenderer($renderer)
->setResponse($fc->getResponse())
->setDalApi(new \DalServices\Api())
->setConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_totalauth_config.php'))
->setMailConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_totalauth_mail.php'))
->setMailer(new \PHPMailer(true));
return $totalauthService;
}
public function getQuickmailService() {
$fc = \Auro\Mvc\Front::getInstance();
$quickmailService = new \SomeNamespace\Quickmail();
$quickmailService
->setSomeNamespaceApi($this)
->setValidator(new \Auro\Validation\Validator())
->setResponse($fc->getResponse())
->setMailConfig(require(CONFIGS_PATH . DIRECTORY_SEPARATOR . 'models_quickmail_mail.php'))
->setMailer(new \PHPMailer(true));
return $quickmailService;
}
}
?>
有人可以确认这实际上是依赖注入容器,什么可以改进?
它看起来不像一个普通的DI容器。这只是一种服务定位器。请参阅https://github.com/ninject/ninject/wiki/Dependency-Injection-By-Hand并在最后按照链接(这是C#,但我相信你会明白的)。在阅读第二页后,你会发现DI容器通常是接口和特定实现之间的粘合层。所以你请求“给我一些IFoo接口的实现”并检索一个特定的对象。 – zerkms
您也可以阅读http://mnapoli.github.com/PHP-DI/它是PHP的依赖注入容器 –