对于Symfony2,我正在构建一个应用程序,它使用外部API获取数据。我创建了许多客户机类来检索和转换API中的每个实体,并且我将这些类定义为服务--例如,我有一个FooClient,其方法为getAll()或getThoseThatInterestMe($me),这些方法从API返回数据。
现在我想创建一个ApiClientFacade类,它充当所有XxxClient类前面的接口,遵循Facade Pattern -例如,这个facade类将有一个方法getAllFoo(),然后调用FooClient::getAll(),等等……
我也可以将我的facade类定义为一个服务,但是它有太多的依赖项--我有大约30个客户端类。而且,使用这种方法,我每次都要加载所有30个依赖项,而大多数时候我只需要一个依赖项.
那么,有什么更好的方法吗?
发布于 2015-03-29 23:23:46
使用额外的ApiClientFactory将“ApiClient对象的实例化”的责任从您的ApiFacade类中转移出来(正如我所理解的,这是您的最初想法)。
在一些伪-php代码中,我的想法是:
$api = new ApiFacade(new ApiClientFactory);
$api->sendNotificationAboutUserLogin('username', time());方法的一个例子:
class ApiFacade {
private $apiFactory;
public function __construct(ApiClientFactory $factory)
{
$this->apiFactory = $factory;
}
public function sendNotificationAboutUserLogin($username, $timeOfOperation)
{
return $this->apiFactory
->createApi('User')
->post(
'notifications',
array('operation' => 'login', 'username' => $username, 'timeOfOperation' => $timeOfOperation)
);
}
}在这种情况下,您的Facade类仍然是可注入的(可测试的),但也变得更简单,可以实例化(不再需要将所有依赖项传递给它)。
ApiClientFactory应该是这样的:
class ApiClientFactory {
private $apiBaseUrl;
public function __construct($apiBaseUrl)
{
$this->apiBaseUrl = $apiBaseUrl;
}
public function createApi($apiName)
{
switch ($apiName) {
case 'User': return new \My\UserApi($this->apiBaseUrl);
default: // throw an exception?
}
}
}https://stackoverflow.com/questions/29335066
复制相似问题