MicroHelper.Net

雷锋说.对待朋友要MicroHelper,对待敌人要害尔扑
随笔 - 74, 评论 - 431, 引用 - 7

导航

关于

邮件系统不稳定,使用songdming at 263 dot net吧
PageRank

FastCounter by bCentral

 

标签

每月存档

最新留言

  • re: 代码组织
    <a href="http://www.vgoldseller.com/runescape-c-599.html">runescape money</a> ...
    by cxb000(匿名) on 2008/3/26 10:32:11
  • 回复: 看PPMM
    <a target="_new" href="http://www.bestgoldlion.com">http://www.bestgoldlio...
    by runescape gold(匿名) on 2007/12/18 5:13:00
  • 回复: IoC初阶
    <a target="_new" href="http://www.bestgoldlion.com">http://www.bestgoldlio...
    by runescape gold(匿名) on 2007/12/18 5:12:00
  • 回复: 数据分页 (最后更新2003/11/18)
    <a target="_new" href="http://www.sky361.com">http://www.sky361.com</a&...
    by wow power leveling(匿名) on 2007/12/18 5:06:00
  • 回复: iBATIS.Net
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:04:00
  • 回复: 防范Sql注入式攻击
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: TDD——NUnit的原理
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: 开源的CMS
    <a target="_new" href="http://www.rsgold-rsgold.com">http://www.rsgold-rsg...
    by runescape money(匿名) on 2007/12/18 5:03:00
  • 回复: CCNet 1.0即将发布
    <a target="_new" href="http://www.sky361.com">http://www.sky361.com</a&...
    by runescape gold(匿名) on 2007/12/18 5:00:00
  • 回复: 关于加班
    为什么这年头加班都成了是我们 的义务了?加班不给加班费也就算了,难得早点回去,还要说三道四的,这社会会为什么会发展成这样啊????
    by 小小(匿名) on 2007/12/14 8:18:00
  • 回复: Presentation草稿:面向对象设计的基本原则
    是的,模式要实事求是,应该是解决问题为主 <br>我搜集了原则方面的文章,有空去看看吧 <br><a target="_new" href="...
    by objecttutor(匿名) on 2007/10/31 17:26:00
  • 回复: 开源的CMS
    支持一下
    by qingxingmeng(匿名) on 2007/10/30 18:03:00
  • 回复: .Net的开源项目
    AnyView(网络警)网络监控软件是一款国内目前最专业的企业级的网络监控软件产品。包含局域网上网监控、邮件监控、聊天监控、BT禁止、流量监视、上下行分离流量限制、并发连接数限制、屏幕监视和录象、硬件...
    by 网络监控软件(匿名) on 2007/10/30 12:33:00
  • 回复: .Net的开源项目
    AnyView(网络警)网络监控软件是一款国内目前最专业的企业级的网络监控软件产品。包含局域网上网监控、邮件监控、聊天监控、BT禁止、流量监视、上下行分离流量限制、并发连接数限制、屏幕监视和录象、硬件...
    by 网络监控软件(匿名) on 2007/10/30 12:32:00
  • 回复: 看PPMM
    好看就成 <br>
    by 11(匿名) on 2007/10/27 15:43:00

广告

 

最近很懒,简直说是无所事事,blogdrive很少更新,博客堂也没有动,一回顾,很多老大最近似乎也是很少出现,神龙见首不见尾呀。

最近考虑以后的职业规划,似乎软件开发提供咨询服务是一个不错的方向,名字嘛,就叫做MicroHelper吧(MicroHelp已经给注册了)

最近IoC很热门,一般翻译为控制反转,也就是一个类将一些工作交给framework(或者控制器)来做。从本质上讲是面向对象的设计原则之一——接口可具体实现的分离的一个具体体现,对象之间解耦的一种方法。

比如说,我们希望设计一个更好用的DropDownList控件,它可以按照如下的方式工作

在这里,我们只关注DataSourceKey这个属性,DataSourceKey是指控件希望根据这个key就可以得到data source,然后自动绑定,那么怎么根据key来得到data source呢,我们需要一个services来完成这件工作

于是我们定义一个接口 IDataSourceProvider

interface IDataSourceProvider
{ ICollection GetDataSource(string key); }

然后有一个类来实现这个接口
class MyDataSourceProvider : IDataSourceProvider
{
 ICollection GetDataSource(string key)
 { ... }
}

class ExDropDownList
{
 IDataSourceProvider myProvider;

 ......
 
 if(AutoBind==true &&
IsDataBound==false)
 {
  IDataSourceProvider myProvider= (IDataSourceProvider) new MyDataSourceProvider ();
  DataSource = myProvider.GetDataSource(DataSourceKey);
  DataBind();
 }
 
 .............. 
}


这不是一种好的做法,因为这种实现方法大大加强了ExDropDownList和DataSourceProvider之间的依赖关系,在这个例子里,ExDropDownList不仅依赖接口IDataSourceProvider,而且依赖接口的具体实现MyDataSourceProvider,不符合面向对象的原则,如果只是自己项目用问题还不是很大,但是如果别的team也希望用这个控件,但是他们有另外一种提供data source的方法,那么应该怎么办呢。

解耦的办法由很多种,其中一种是把具体创建IDataSourceProvider实例的工作交给容器或者framework来做,也就是说将对IDataSourceProvider的控制反转,有容器决定创建哪一个IDataSourceProvider实例,

接下来,怎么把创建好的IDataSourceProvider实例告诉ExDropDownList呢(或者说注入,Injection)
有三种方法,一种是构造注入,也就是在创建ExDropDownList时就告诉它,哪一个IDataSourceProvider实例可以为你提供GetDataSource的服务

class ExDropDownList
{
 private IDataSourceProvider provider;

 ExDropDownList(IDataSourceProvider  provider)
 {
  this.Provider = provider;
 }
}


另一种方法是设值注入,也就是ExDropDownList对外公布一个方法setProvider或者公布一个属性Provider,让容器可以把创建好的IDataSourceProvider实例传给ExDropDownList。

class ExDropDownList
{
 private IDataSourceProvider provider;

 public Provider
 {
  get{}
  set{}
 }
}

....
ExDropDownList.Provider = (IDataSourceProvider) new MyDataSourceProvider ()
....

第三种是接口注入,也就是说调用者和服务提供者定义一个协议,ExDropDownList如果需要使用DataSourceProvider提供的服务,就需要根据协议实现一个InjectProvider的接口,以便于容器通过这个接口将IDataSourceProvider实例传给ExDropDownList

interface IInjectProvider
{ viod SetProvider(IDataSourceProvider provider ); }

class ExDropDownList : IInjectProvider
{
 SetProvider(IDataSourceProvider provider)
 {
  this.provider = provider;
 }
}


((IInjectProvider)ExDropDownList).SetProvider(IDataSourceProvider) new MyDataSourceProvider ());

接口注入的方法因为对象间还是有很高的耦合度,所以应用不是很广泛。

构造注入和设值注入那一种更好呢。
martin fowler给出了一个解释:
构造注入和设值注入反映了面向对象编程的一个普遍问题,应该在哪里填充对象的字段,是在创建对象时还是通过属性或者方法来设定值。martin fowler建议在对象构造时就创建完正合法的对象,这样做还有一个好处就是可以隐藏不可改变的字段(注:或者不应该在运行期间随意
改变的字段),而公布一个设置方法,就意味着调用者可以自由改变字段的值。

凡事总有例外,如果参数太多,构造注入使系统显得有点凌乱,而且有些时候没有办法使用构造注入,比如上面ExDropDownList 的例子,创建ExDropDownList 实例不是我们的framework能够控制的。需要设值注入来协助。

我们怎么做的呢?把ExDropDownList的provider定义为静态属性,然后在Application_BeginRequest事件赋值
DataSourceProvider provider = new DataSourceProvider();
ExDropDownList.dataSourceProvider = provider;

这属于代码配置

用ExDropDownList 的例子来说明IoC不太恰当,因为ExDropDownList不是我们的framework能够完全控制的。除了IoC这种解耦方法外还有别的方法比如在config文件定义哪一个Assembly可以提供GetDataSource服务,或者我们定义一个ServicesFind类,它知道怎么样可以得到我们所需的IDataSourceProvider实例。

IoC现在看来,主要是用来解决接口参数的注入。framework可以根据很简单的约定,将不同组件组装起来,IoC不是新的事物,也不是哪一种语言的特有功能,只是一种组件的协作和组织方式。

Microhlper.HOWTPPSE.V010

打印 | 张贴于 2004-06-24 13:44:00 | Tag:拥抱变化

留言反馈

#回复: IoC初阶 编辑
2007-12-18 05:12:00 | [匿名:runescape gold]
#re: IoC初阶 编辑
其实小项目也有用得着IoC的地方,如一个小项目的计费系统,假如提供客户程序的API可以是固定的,真正改变账户金额的方法可以是固定的,但计算费率的类绝对不能是固定的--因为你随时会因为市场因素而改变扣费的费率,或者扣费折扣。
2005-07-26 22:57:00 | [匿名:Frankie]
#re: IoC初阶 编辑
总觉得IOC不适合用在中小项目中,而适合用在大项目或者核心框架设计中,不知有无同感者?
2004-09-17 13:44:00 | [匿名:老鹰]
#回复: IoC初阶 编辑
东西还可以,不过有点新瓶装旧酒的感觉。
2004-06-28 17:34:00 | [匿名:fa2002]
#回复: IoC初阶 编辑
Haha, I was just kidding...forget it. :)
2004-06-24 20:34:00 | [匿名:JGTM'2004 [MVP]]
#回复: IoC初阶 编辑
ex-girlfriend?

我以为是No Doubt的音乐呢,原来是另有含义呀!
your ex-girlfriend ;-) , 前……

2004-06-24 19:48:00 | [匿名:害尔扑]
#回复: IoC初阶 编辑
哈哈,ex-前缀有“前……”的意思呀!噢!原来你是希望ExDropDownList成为DropDownList的前辈!;-)

BTW: Where are you downloading my "ex-girlfriend"? :|
2004-06-24 18:56:00 | [匿名:JGTM'2004 [MVP]]
#回复: IoC初阶 编辑
不是我键盘不太灵光,是我的手不太灵光,总是打错字,又不仔细检查,归根结底,态度不端正呀。

命名建议都很正确,IsDataBinded之类属于不可原谅的拼写错误,ServicesFind类一般习惯命名为ServiceLocator也很赞同,因为这种方法可归于Service Locator模式。

我也提到了这个例子用来解释IoC确实不太合适,只是正看到这段代码,顺便就拿来做例子了。

ex-girlfriend? 以前没听过,正在下载。

不当之处还请多指点。
2004-06-24 18:08:00 | [匿名:害尔扑]
#回复: IoC初阶 编辑
实话实说,这个例子举得略显失妥。当然,虽然IoC的概念比较简单,但确实不是很容易向没接触过的人讲解明白。尤其是IoC对贯彻面向对象设计原则之DIP、OCP及SRP的贡献。

原来我是这样解释应用IoC的意图和方式的(但还是不够清晰):如果我想打破A->B的依赖,那么我可以通过引入A、B之间的交互协议I来办到,也就是将A->B变为(A->I)+(I<-B)(此举同时满足了DIP和OCP原则),那么IoC就是帮助我们用各种各样的方法(如构造器注入、属性注入或接口注入等等)在运行期把I的一个具体实现B传达给A使用的一系列机制。

另外,老兄的键盘是否不大灵光(provinder、assmly、Micrhlper???)?有空用软键盘修理一下文章吧!:)

还有一些用词和命名方面的建议:IsDataBinded应为IsDataBound;ExDropDownList应为DropDownListEx为妥(如果Ex的版本相比原来的版本做得更好——BTW, do you know my "ex-girlfriend"? ;-) );ServicesFind类一般习惯命名为ServiceLocator或ServiceProvider等。

仅供参考!:)
2004-06-24 16:23:00 | [匿名:JGTM'2004 [MVP]]
#回复: IoC初阶 编辑
good.
go on
2004-06-24 16:04:00 | [匿名:jiezhi]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0