锁定老帖子 主题:阿Q:革命了,革命了!(也谈IOC的好处)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-17
gigix 写道 // Dependent Component public interface BIntf { void doSomething();; } public class BImpl implements BIntf { public void doSomething(); { // do something here. } } // Component A using B // 1. without IoC, direct create public class A { public void doSomething(); { BIntf b; // dependency #1, with BIntf b = new BImpl();; // dependency #2, with BImpl b.doSomething();; } } // 2. without IoC, using customized factory public class A { public void doSomething(); { BIntf b; // dependency #1, with BIntf b = BFactory.create();; // dependency #2, with BFactory b.doSomething();; } } // 3. type 0 IoC public class A { public void doSomething(BIntf b); { // dependency #1, with BIntf b.doSomething();; } } // 4. type 2 IoC, setter injection public class A { private BIntf _b; // dependency #1, with BIntf public void setB(BIntf b); { _b = b; } public void doSomething(); { _b.doSomething();; } } // 5. type 3 IoC, constructor injection public class A { private BIntf _b; // dependency #1, with BIntf public A(BIntf b); { _b = b; } public void doSomething(); { _b.doSomething();; } } 哪个依赖多,哪个依赖少,一目了然。 不要意思我的笔误 是 C-->A 引用 // 这就是你所说的C class Container { public Object getObject(String name); 谁来调用着这个Container?不要老是回避这个问题!不引入C你的代码无法运行! |
|
返回顶楼 | |
发表时间:2005-03-17
JJYAO 写道 C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆代理 你注射给我,我车票代理 你注射给我, 我还需要导游你介绍给我,都全了?我开始给你安排
关键的问题是,如果你认为这家旅馆或车票代理永远不会倒闭的话,你可以这样做....如果一个月后倒闭了...后果 当然由A自己去找新的! 你去找旅行社?还问我以前的呢个旅馆 代理还在么? 你不需要管这个问题,由A自己去解决!A 是独立的!不是殖民地! |
|
返回顶楼 | |
发表时间:2005-03-17
frankensteinlin 写道 谁来调用着这个Container?不要老是回避这个问题!
这问题忒简单。你用Spring MVC或者WebWork+Spring做一个sample,或者就看看JPetStore。你要是需要写一行代码调用container,Rod Johnson就算白写那本书了。 谁调用container?第一肯定不是需要你写的任何代码,你不需要也不应该在任何时候调用container。第二这个框架提供的“调用container”的代码只需要写一遍,写完一遍100个项目都适用。 |
|
返回顶楼 | |
发表时间:2005-03-17
引用 C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆的标准要求 你注射给我,什么标准的车票 你注射给我, 还需要什么标准的导游你介绍给我,都全了?我开始给你安排 A如果是秘书,c会怒:靠,我的标准还不知道? A如果是代理公司,c会高兴:服务真周到. 太好的例子了,标准不都在interface里面规定好了么,inerface 就是合同阿,问题是ioc要求注射的是实例!谁来创建这个实例?C 还是 A ? |
|
返回顶楼 | |
发表时间:2005-03-17
frankensteinlin 写道 由A自己去解决!A 是独立的!不是殖民地!
那么好了,业务组件本来就不应该是独立的,或者说得更准确点,self-contain的。为什么?如果业务组件是self-contain的,它自己管自己的一切外部环境,你就没办法把它拆出来单独测试,你就得把整个外部环境都给它准备到位。你也没办法把它直接弄到另一个环境去复用。 讨论问题就讨论问题,有证据就拿证据出来说,每句话打个感叹号难道就有道理了? |
|
返回顶楼 | |
发表时间:2005-03-17
嘿嘿,简单的讲所谓使用IOC,要不自己实现上面的C,要不利用Springframework,哈哈
|
|
返回顶楼 | |
发表时间:2005-03-17
gigix 写道 frankensteinlin 写道 谁来调用着这个Container?不要老是回避这个问题!
这问题忒简单。你用Spring MVC或者WebWork+Spring做一个sample,或者就看看JPetStore。你要是需要写一行代码调用container,Rod Johnson就算白写那本书了。 谁调用container?第一肯定不是需要你写的任何代码,你不需要也不应该在任何时候调用container。第二这个框架提供的“调用container”的代码只需要写一遍,写完一遍100个项目都适用。 Rod Johnson就算是圣贤,也不是神仙!搬出个权威压不倒我.现在这个例子很简单 就 A B 两个类,你要引入一个ioc framework 让把inject.就算你用typeN好了,谁来做ainstance.setB(binstance)?或者A(binstance)这一步?谁完成这最后一跳? |
|
返回顶楼 | |
发表时间:2005-03-17
gigix 写道 frankensteinlin 写道 由A自己去解决!A 是独立的!不是殖民地!
那么好了,业务组件本来就不应该是独立的,或者说得更准确点,self-contain的。为什么?如果业务组件是self-contain的,它自己管自己的一切外部环境,你就没办法把它拆出来单独测试,你就得把整个外部环境都给它准备到位。你也没办法把它直接弄到另一个环境去复用。 讨论问题就讨论问题,有证据就拿证据出来说,每句话打个感叹号难道就有道理了? 我可以把整个故事讲的很清楚了: 引用 C 说 A 你我去桂林,你帮我安排一下吧!A 说没问题, :对了旅馆代理 你注射给我,我车票代理 你注射给我, 我还需要导游你介绍给我,都全了?我开始给你安排。 活生生的例子阿,到时你抽象的组件阿组件的,软件不就是现实生活的抽象么!你说A应该怎么做?现实的问题啊! |
|
返回顶楼 | |
发表时间:2005-03-17
软件设计本来就是分工协作。
是,每个功能都要有模块做,但是不表示这些功能都要塞到一个模块去做。 否则,任何一个程序都要有个main()才能运行,你是否要让你的类都“独立自主”到非带有main()不可? gigix说必须不能调用容器,或者必须不能自己组装组件。也许我理解错了,我是有点不同意的。 只要这个调用容器的代码或者组装的代码不在组件内部,只要它是一个单独负责组装的模块,是不是必须要由容器自动装配倒无关紧要。 容器代码也没什么特殊,不过是一个专门负责组装对象的模块。如果高兴,或者不愿意依赖容器,那么自己写也没什么。 |
|
返回顶楼 | |
发表时间:2005-03-17
frankensteinlin 写道 现在这个例子很简单 就 A B 两个类,你要引入一个ioc framework 让把inject.就算你用typeN好了,谁来做ainstance.setB(binstance)?或者A(binstance)这一步?谁完成这最后一跳?
不妨假设A是一个web action。我相信你没用过IoC容器也该用过MVC框架例如Struts和WebWork,那么你肯定知道,HTTP请求进来以后有一个总控的DispatchServlet解析query string,然后把请求分发到action。那问题就很简单,DispatchServlet调用Container.getObject("bName"),取到B的实例,交给A去用。这部分逻辑在DispatchServlet实现一遍,所有的web action都可以被注射。 请注意,唯一需要调用container的理由,是取到一个business facade。facade以下的所有组件,容器内部已经装配完毕。“取得facade”的动作,如上所述,只需要在框架(例如MVC框架)实现一次,所有项目都可以复用。请问还有什么问题? 引用 嘿嘿,简单的讲所谓使用IOC,要不自己实现上面的C,要不利用Springframework,哈哈
错。你还可以用PicoContainer,你还可以用HiveMind。 |
|
返回顶楼 | |