首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在SOA中使用依赖注入?

如何在SOA中使用依赖注入?
EN

Stack Overflow用户
提问于 2011-06-16 20:25:01
回答 1查看 628关注 0票数 3

我目前正在使用面向服务架构,我有一堆服务(ArticleService、CommentService、UserService等)。

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

我使用的是Zend框架。

我的一些服务需要THis配置服务,而我正在使用依赖注入,在大多数我的服务的构造函数中添加ConfigurationService以获取全局配置是一种好的做法吗?

感谢您的反馈。

EN

回答 1

Stack Overflow用户

发布于 2011-06-17 06:18:26

我会说,不,不要在其他服务的构造函数中传递配置容器-既不作为服务,也不作为数组或Zend_Config实例。我会将这些服务的注入(无论是通过构造函数还是通过setter)集中在它们实际需要的实际对象/协作者/数据上。

因此,例如,ArticleService可能依赖于ArticleRepository接口/对象,或者依赖于ArticleMapper或db适配器。让ArticleService的构造函数/设置器签名反映它真正需要的东西。

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

我脑海中的一小段可能是:

引导程序代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initFactory()
    {
        $factory = new My_Factory($this);
        return $factory;
    }
}

然后工厂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'];
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
    }

}

这里的结果是,每个服务都显式地标识它需要的协作者,而工厂是一个单独的位置,负责创建/注入所有这些协作者。

最后,我承认我只是在这里吐口水。对我来说,这本质上是一个基本的依赖注入容器;从这个意义上说,使用功能齐全的DIC -可能是Symfony DIC或ZF2中的新Zend\Di包-可能更好。但经过几个月的努力,我得到了注入依赖项的所有最佳实践建议,以下是我提出的建议。如果这是愚蠢的或者是完全错误的,请(请!)帮我拉直身子。;-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6378160

复制
相关文章
vue如何动态加载本地图片
大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我(全网同名),解锁前端成长新姿势。
Daotin
2021/07/28
4.2K0
vue 重新加载页面_页面重新加载
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/03
4.6K0
如何采集javascript动态加载网页
从一个运行 javascript 的网站加载所有数据来加载内容,目前的问题是当运行启动代码时它无法加载 javascript 内容,因为用户应该向下滚动才能加载。如何编写启动代码来滚动整页呈现 javacript 并返回 html呢?
jackcode
2023/05/24
9890
如何采集javascript动态加载网页
JavaScript 动态加载脚本和样式
3大点: 1.元素位置 2.动态脚本 3.动态样式 一.元素位置 getBoundingClientRect()。这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离。 var box = document.getElementById('box');//获取元素 alert(box.getBoundingClientRect().top);//元素上边距离页面上边的距离 alert(box.getBoundingClientRect()
汤高
2018/01/11
1.4K0
Stimulsoft Web版中如何动态修改Json数据源的Url
在Stimulsoft Report(目前我使用的是2022.1.2版本)中,可以支持从JSON文件或者在线URL作为数据源。
崔文远TroyCui
2022/01/14
1.9K0
Stimulsoft Web版中如何动态修改Json数据源的Url
javascript加载数据简述
加载资源的形式 输入url(或跳转页面)加载html 加载静态资源:图片,js,css,音视频等 加载一个资源的过程 浏览器根据DNS服务器得到域名的IP地址 向这个IP的机器发送http请求 服务器收到,处理并返回http请求 浏览器得到返回内容 浏览器渲染页面的过程 根据HTML结果生成DOM Tree 根据CSS生成CSSOM(CSS Object Model) 将DOM和CSSOM整合形成RenderTree 根据RenderTree开始渲染和展示 遇到<script>标签时,会执行并阻塞渲染 渲染
踏浪
2019/07/31
5450
2.6 从JSON数据源导入数据
案例:读取并解析GitHub(http://github.com)网站的最近活动时间表
全栈程序员站长
2022/09/06
1.1K0
CentOS本地源
冷影玺
2023/10/11
3780
SSM动态切换数据源
这里默认大家都会SSM框架了,使用时我们要往sqlSessionFactory里注入数据源。那么猜测:1、可以往sqlSessionFactory里注入多数据源来实现切换;2、将多个数据源封装成一个总源,再把这个总源注入到sqlSessionFactory里实现切换。答案是使用后者,即封装成总源的形式。Spring提供了动态切换数据源的功能,那么我们来看看其实现原理
晚上没宵夜
2020/03/10
1.1K0
springboot动态多数据源
参考文章:https://www.cnblogs.com/hehehaha/p/6147096.html
用户1225216
2019/05/25
9630
【说站】javascript如何动态加载js文件
2、通过xhr方式加载js文件,不过通过这种方式的话,就可能会面临着跨域的问题。
很酷的站长
2022/11/23
7.3K0
【说站】javascript如何动态加载js文件
HtmlUnit动态数据未加载
因为程序的读取速度会快一些,而且推测 HtmlUnit是异步读取 html , css ,js
taixingyiji
2022/07/25
1.3K0
Python 重新加载模块
出于效率原因(导入必须找到文件,将其编译成字节码,并且运行代码),Python shell 在每次会话中,只对每个模块导入一次。
py3study
2020/01/03
4.5K0
本地配置yum源
yum是Linux环境安装软件包的一种方式。yum仓库用来存放所有的现有的.rpm包,当使用yum安装一个rpm包时,需要依赖关系,会自动在仓库中查找依赖软件并安装。yum仓库可以是本地的,也可以是HTTP、FTP、nfs形式的网络仓库 。
半条命专刊
2020/09/14
2.5K0
javascript:FF/Chrome 与 IE 动态加载元素的区别
今天在写一段js时,发现IE与FF在动态加载Html元素时,有一些差别,看下面的代码: <!doctype html> <html> <head> <title>ff 与 ie 动态加载元素的区别</title> <script type="text/javascript" src="jquery-1.4.4.min.js"></script> <style type="text/css"> li{margin:0;padding:0;list-style:none} </style> <sc
菩提树下的杨过
2018/01/23
1.6K0
javascript:FF/Chrome 与 IE 动态加载元素的区别
GoogleMaps api for javascript demo 动态按顺序加载marker
@{ } <!DOCTYPE html> <html lang="zh"> <head> <meta name="viewport" content="initi
阿新
2018/04/12
8040
使用本地yum源
# mount /data/isos/CentOS-7-x86_64-Everything-1511.iso /yum
用户5579903
2022/10/26
1.6K0
使用本地yum源
js读取本地json文件_jquery读取本地json文件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
21.6K0
js读取本地json文件_jquery读取本地json文件
UOS本地源配置
冷影玺
2023/10/11
1.3K0
点击加载更多

相似问题

uisearchbar性能问题textDidChange

14

UISearchBar textDidChange不开火

32

关于UISearchBar: predicateWithFormat的textDidChange

13

plist中的UISearchBar textDidChange数据

224

如何检测textDidChange: on UISearchBar是听写触发的

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文