服务定位器和laravel 依赖注入容器器到底什么区别

控制反转容器& 依赖注入模式 ---读感。
时间: 17:18:07
&&&& 阅读:18
&&&& 评论:
&&&& 收藏:0
标签:几个web框架 : sprint Avalon PicoContainerclass MovieLister
MovieFinder finder = ServiceLocator.movieFinder();
//单件注册表 注册的时候 载入一个已经确定好属性的服务定位器class ServiceLocator... public static MovieFinder movieFinder(){
return soleInstance.movieF }
private static ServiceLocator soleI private MovieFinder movieF
public static void load(ServiceLocator arg) {
soleInstance = } public ServiceLocator(MovieFinder movieFinder) {
this.movieFinder = movieF }
code class Tester private void configure(){
//说明服务定位器是有构造函数可以在这个时候来决定实用的movieFinder的。
ServiceLocator.load(new ServiceLocator(new ColonMovieFinder("Movie1.txt"))); }
public void testSimple(){
configure();
MovieLister lister = new MovieLister();
Movie[] movies = lister.moviesDirectedBy("Sergio");
assertEquals("Once Upon a Time in the West", movies[0].getTitle()); }//ServiceLocator 应该是一个静态的全局变量,如此lister 才能直接载入。//更复杂的情况: 服务定位器派生子类,并且将子类传递给注册表类变量。??? // 暴露一个静态方法,而不是直接访问该类实例的变量。
//-------单件模式 -------------//以上设计的设计模式
//为定位器使用分离接口://由于list 可能只需要使用一个服务,可以使用角色接口(role interface)这样不用使用全部的服务接口,只需要声明需要使用的接口就行了。public interface MovieFinderLocator{ public MovieFinder movieFinder();}
class MovieLister MovieFinderLocator locator = ServiceLocator.locator(); MoiveFinder finder = locator.movieFinder();
class ServiceLocator public static ServiceLocator locator(){
return soleI } public MovieFinder movieFinder() {
return movieF } private static ServiceLocator soleI private MovieFinder movieF//这个时候,由于使用了接口,就无法使用静态变量了,需要使用locator() 来 获取一个实例
//动态服务定位器 上面两个例子是静态的,但是我们也可以使用动态服务定位器,允许在其中注册需要的服务,并且在运行时动态按需获取。// 如下 服务定位器是使用map来保存服务信息,而非放到字段中。class ServiceLocator private static ServiceLocator soleI public static void load(ServiceLocator arg){
soleInstance = }
private Map services = new HashMap(); public static Object getService(String key){
return soleInstance.services.get(key); } public void loadService(String key, Object service){
service.put(key, service);
class Tester private void configure(){
ServiceLocator locator = new ServiceLocator();
locator.loadService("MovieFinder", new ColonMovieFinder("movie1.txt"));
ServiceLocator.load(locator); } class MovieLister MovieFinder finder = (MovieFinder) ServiceLocator.getService("MovieFinder");
//Locator 和 Injection 同时使用的案列:public class MyMovieLister implements MovieLister, Serviceable { private MovieF
public void service(ServiceManager manager) throws ServiceException {
finder = (MovieFinder) manager.lookup("finder"); }}//容器将中ServiceManager对象注入到list 中,ServiceManager 是一个服务定位器的,使用它来查找finder实例
//-------服务定位器和依赖注入的对比服务定位器比较直观,但是所有的请求者都会需要依赖服务定位器如果需要提供一个组件出去,最好还是使用注入的方式,因为无法控制使用者会使用什么样的实现,可以直接使用注入来定义对应的实现。
//-------构造注入和属性注入比较两者都比较容易配置,而接口注入的方式十分容易在各处代码中泛滥。构造注入和属性注入就涉及了是否应该在构造的时候就对属性进行赋值。构造注入可以将属性设置为不可变的,并且可以明确意图。属性注入在参数太多的时候很有必要,同时有多个方法来构造一个有效对象时,就可以使用Factory Method的模式。同时如果对象有很多的构造器,并且对象间存在继承关系,这可能会导致构造器膨胀,由于子类的构造器需要调用父类的构造器然后再处理自己的参数。//----代码配置还是文件配置 对于多数多处部署的应用程序来说,使用配置文件的方式比较好,我想是因为方便查看的原因。配置文件也多为XML,不过我们之前的项目多用json文件进行配置。 如果配置文件变得复杂了 就需要考虑换一个适合的编程语言来实现。 其中提到的:如果一个配置的逻辑变得复杂了,应该使用适合的语言来描述配置信息 这里没有考虑到对应的情况,不过觉得之前的表数据的配置,是否也可以用语言来实习?而不是一直增加怕配置文件。是否是会更加明了。 有很多组件有各自的配置文件,需要维护不同的配置文件,这种情况可以通过统一的编程接口来提供,可以分开配置文件。通过这个接口,可以管理配置文件???? 只想到了可以统一配置文件来实现,但是这里所说的统一配置文件接口的情境没有想好。
//------将配置和应用分离 服务的配置和应用分离,之前的应用就是这样的,单独配置应用的配置文件的地方。 一个设计原则:分离接口和具体的实现。 比如数据源的使用,测试的时候 可能是直接读取文件配置来着,但是在生产环境的时候,是读取服务器上的数据源JNDI的配置。
重点是应该将 服务配置从应用程序内部分离出来。
http://www.cnblogs.com/me-sa/archive//IocDI.html
http://www.martinfowler.com/articles/injection.html
&标签:原文地址:http://www.cnblogs.com/edenpans/p/5960647.html
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
以下是Yii2源码中,ServiceLocator(服务定位器)与Container(依赖注入容器)的关系解析图。
一句话总结
Application继承了ServiceLocator,是一个服务器定位器,ServiceLocator用来管理和缓存组件的实例化对象。ServiceLocator调用Yii::createObject方法创建类得实例化对象,Yii::createObject实际上又调用了Container(依赖注入容器)获取每一个类的实例化对象。Container(依赖注入容器)自动解决待实例化类的依赖关系,并返回待实例化类的实例对象。
0 收藏&&|&&1
你可能感兴趣的文章
3 收藏,744
3 收藏,990
3 收藏,1.3k
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。246被浏览47,303分享邀请回答____________________________________________________________
还是一步一步解释最为简单,好比搬用数学公式,不理解还是不懂。____________________________________________________________
假如有一个 船(C)类 ,一个 桨(J) 类,class C{
J j = new J() ;
如果船要干什么事,肯定需要浆的参与。所以是十分 “依赖”浆;出了需求需要重构:这时候我们需要控制浆的长度为10在构造方法中。我们需要这么写;class C{
J j = new J(10) ;
一个特性需要修改浆构造方法,又需要修改船其中的new J()方法。这时候就设计者就思考,为什么我们加入一个特性需要更改两个类中代码(这也就是耦合度高)!所以我们要解耦要依赖注入;常用解耦方式:构造方法注入如下:我重构代码的时候在也不用看哪里的浆还是短的了!因为船构造方法依赖了浆。任你浆怎么设计,我用的时候传一个浆进来即可。(下层依赖上层,用的时候传入,而不是针对下层去修改)class C{
public c(J j){
this.j = j;
工厂模式注入工厂模式 Human 人 去注入; 工厂类如下Class Human {
J j =new J();
J getJ(){
此时如下:不管你怎么改浆,改成100米与船都无关,他只要依赖Human,一千个船修改浆需求我只修改Human类中方法便可。(核心业务逻辑需要依赖的类实例化交给第三方类来实现注入。)Class C {
Human h = new Human;
j=Human.getJ();
框架注入(本质还是工厂设计模式的具体实现)本质也是第三方依赖注入,但是这个第三方可以脱离类。将对象依赖映射信息存储在容器一般为.xml 或者特定的对象中,并实现动态的注入。你需要我就给你哦。最后本人个人理解:为什么要有依赖注入(一种设计代码模式),因为我们要控制反转(设计代码的思路)。为什么控制反转。因为我们软件设计需要符合软件设计原则依赖倒置(设计代码原则),单一职责原则。说通俗点,咱们要解耦啊。MVP模式就是解耦比较全面的设计模式模型,499 条评论分享收藏感谢收起607 条评论分享收藏感谢收起Service Locator
提到了依赖注入还是说说服务定位(service locator),服务定位同样可以达到和依赖注入一样的效果:消除对具体实现类的依赖,但是程序会依赖于服务定位器。
基于30个网页-
Service Location
可测试的控制器 ... 一种解决方式是使用依赖倒置。依赖倒置指,任何依赖应该基于抽象而不是实现(concretion)。 服务定位(Service Location) 我们从原来的RoleController类中抽出来一个接口IRoleController ...
基于27个网页-
Traffic Service Position System
Using a Service Locator
Service Locator
Server Locator
Service Locator
Service Locator Pattern
service locator records
Service Locator
Service Locator Protocol
ServiceLocationMechanism
Service Location Protocol
Service locator pattern
更多收起网络短语
service location
- 引用次数:12
Finally, we also give a brief introduction of remote service discovery in the service location protocol via DNS SRV.
最后,本文还对利用DNS SRV的服务定位协议的远程服务发现进行了简单介绍。
参考来源 - 服务定位协议在跨域认证系统中的应用研究
&2,447,543篇论文数据,部分数据来源于
我的第三个实现使用没有缓存的服务定位器。
My third implementation used a service locator with no cache.
剩下的一个选择是使用服务定位器使用集合的方式,但是要去除引用缓存。
The remaining alternative is to use a service locator, make it a singleton, but remove the reference cache.
带有资源缓存的集合服务定位器创建全局缓存,通过这种方式不能为重载的资源名正确处理组件级映射。
A singleton service locator with a resource cache creates a global cache that cannot properly handle the component-level mappings for an overloaded resource name.
$firstVoiceSent
- 来自原声例句
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!2012年1月 .NET技术大版内专家分月排行榜第一2011年12月 .NET技术大版内专家分月排行榜第一2011年11月 .NET技术大版内专家分月排行榜第一2008年3月 .NET技术大版内专家分月排行榜第一
2010年4月 .NET技术大版内专家分月排行榜第二2008年2月 .NET技术大版内专家分月排行榜第二
2011年9月 总版技术专家分月排行榜第一2011年8月 总版技术专家分月排行榜第一2011年7月 总版技术专家分月排行榜第一2011年6月 总版技术专家分月排行榜第一2011年5月 总版技术专家分月排行榜第一2011年4月 总版技术专家分月排行榜第一
2011年3月 总版技术专家分月排行榜第二2011年2月 总版技术专家分月排行榜第二
2012年1月 .NET技术大版内专家分月排行榜第一2011年12月 .NET技术大版内专家分月排行榜第一2011年11月 .NET技术大版内专家分月排行榜第一2008年3月 .NET技术大版内专家分月排行榜第一
2010年4月 .NET技术大版内专家分月排行榜第二2008年2月 .NET技术大版内专家分月排行榜第二
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2017年2月 总版技术专家分月排行榜第三
2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 依赖注入 反射 区别 的文章

 

随机推荐