gpt4 book ai didi

zend-framework - 如何在 SOA 中使用依赖注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 06:51:16 25 4
gpt4 key购买 nike

我目前正在使用 SOA,我有一堆服务(ArticleService、CommentService、UserService 等)

我还有一个从 XML 配置文件填充的 ConfigurationService。

我正在使用 Zend 框架。

我的一些服务需要这个配置服务,我正在使用依赖注入(inject),在我的大多数服务的构造函数中添加 ConfigurationService 以便能够获取全局配置,这是一个好习惯吗?

感谢您的反馈。

最佳答案

我会说,不,不要在其他服务的构造函数中传递配置容器——既不是作为服务,也不是作为数组,也不是 Zend_Config 实例。我会保持对那些服务的注入(inject)(无论是通过构造函数还是通过 setter)专注于他们实际需要的实际对象/协作者/数据。

因此,例如,ArticleService 可能依赖于 ArticleRepository 接口(interface)/对象、ArticleMapper 或数据库适配器。让 ArticleService 的构造函数/setter 签名反射(reflect)它真正需要的东西。

相反,我会做的是在 Bootstrap 期间,创建某种工厂对象 - 也许作为应用程序资源 - 在其构造函数中接受您的配置数据/对象/服务(或者更好, bootstrap 实例本身,您不仅可以从中获取配置数据,还可以获取在 bootstrap 过程中创建的任何应用程序资源,例如数据库适配器)。然后在您的工厂对象上编写方法来创建/提供您需要的其他服务。在内部,工厂维护已创建服务的注册表,以便它可以在需要时延迟创建实例。

我的想法可能如下所示:

Bootstrap 片段:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initFactory()
{
$factory = new My_Factory($this);
return $factory;
}
}

然后是工厂:

class My_Factory
{
protected $_registry;

protected $_bootstrap;

public function __constructor($bootstrap)
{
$this->_bootstrap = $bootstrap;
}

public function getDbAdapter()
{
if (!isset($this->_registry['dbAdapter']){
$this->_bootstrap->bootstrap('db'); // probably using app resource
$this->_registry['dbAdapter'] = $This->_bootstrap->getResource('db');
}
return $this->_registry['dbAdapter'];

}

public function getArticleService()
{
if (!isset($this->_registry['articleService']){
$dbAdapter = $this->getDbAdapter();
$this->_registry['articleService'] = new My_ArticleService($dbAdapter);
}
return $this->_registry['articleService'];
}

public function getTwitterService()
{
if (!isset($this->_registry['twitterService']){
$options = $this->_bootstrap->getOptions();
$user = $options['twitter']['user'];
$pass = $options['twitter']['pass'];
$this->_registry['twitterService'] = new My_TwitterService($user, $pass);
}
return $this->_registry['twitterService'];
}
}

然后在 Controller 中,您可以获取一个 ArticleService 实例:

class SomeController extends Zend_Controller_Action
{
protected $_factory;

public function init()
{
$this->_factory = $this->getInvokeArg('bootstrap')->getResource('factory');
}

public function someAction()
{
$articleService = $this->_factory->getArticleService();
$this->view->articles = $articleService->getRecentArticles(5); // for example
}

}

这里的结果是每个服务都明确标识了它需要的协作者,工厂是一个负责创建/注入(inject)所有这些协作者的地方。

最后,我承认我只是在这里吐口水。对我来说,这本质上是一个基本的依赖注入(inject)容器;从这个意义上说,使用功能齐全的 DIC——也许是 Symfony DIC 或 ZF2 中新的 Zend\Di 包——可能会更好。但是,在与所有最佳实践建议进行了数月的斗争以注入(inject)您的依赖项之后,这就是我想出的。如果它很愚蠢或完全错误,请(请!)纠正我。 ;-)

关于zend-framework - 如何在 SOA 中使用依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com