用配置还用Attribute来实现IoC?

昨天看了Idior的文章EnterLib ObjectBuild vs Castle WindsorContainer, part 1,联想到我前面刚交付的一个系统,感触颇为深刻。在我那个系统的业务层只暴露了六个关键的接口,这些接口用于处理一些核心的运算:

>>实现运行时的URL计算;

>>在网格中打开相应的实体类;

>>在实体类中显示到网格中的属性转换器;

>>在编辑器中使用相应的属性编辑器。

实现这些接口,一共用了接近1000个内部类,有些类的实现甚至只需要一行代码(例如从某个类派生但需要覆写某一个方法以便更换约束子)

为了管理这些实现类,我建立了一个专门的枚举,这个枚举包括近100个项,囊括了整个业务层涉及到的所有层面。然后定义一个ServiceMasterAttribute的标签,将这些类列到每个枚举项上。在这个标签的静态构造器中,找到所有枚举项的所有实现类,并通过专门的类进行管理,再通过Service类封装这个管理器,得到一个简单的API

public static object Service.GetObject(TargetType targetType, Type expectType)

只需要将这个枚举的定义与所有的实现类放在同一个程序集中,就完全可以将这些实现类隐藏起来。可以看出来,这种方式简单而有效。

另外一个同事,负责整个系统的报表,采用一个自定义的控件来实现数据到HtmlTable的变换。在这个变换过程中,定义了一个接口,用于填充单元格的数据。在实现这个接口的过程中,根据项目实际又组织了六个内部接口,通过70多个类来实现这些接口,然后由这些接口通过专门的类来组织单元格填充接口。因为系统业务层提供了一种非常方便的配置文件访问方式,所以他采用配置文件来定位这些类,结果就冒出来一种很奇怪的现象:具体实现类必须public修饰以便配置文件管理可以拿到这些类型;而接口只是用来在内部以适配器方式接入单元格填充接口,反而只需要internal修饰。

所以,采用标签方式所获得的IoC具有通过配置文件所不具备的两大优势:

>>运行时类型检查,设计时就可以避免拼写错误这些低级的错误;

>>完全隐藏实现细节,只需要将接口暴露出来

标签方式也存在一个缺点:不能通过修改配置来修改实现类,而必须重新编译。

所以,如果你真的需要在运行时修改配置而不用重新编译的话,就必须采用配置方式来定位类的实现。
posted @ 2006-08-16 13:09 双鱼座 阅读(2140) 评论(10) 编辑 收藏

 回复 引用 查看   
#1楼 2006-08-16 16:20 idior      
其实在很多时候都面临这个问题 Attribute or Configuration file?

ioc , orm , aop 都是如此

 回复 引用 查看   
#2楼 2006-08-16 22:00 uGoer      
我更多的采用了Attribute
 回复 引用 查看   
#3楼 2006-08-16 22:05 Ring      
采用配置文件,修改时不用重新编译, 而且不用修改原代码。
我个人更喜欢采用配置文件!

 回复 引用 查看   
#4楼 2006-08-16 22:08 idior      
采用配置文件,修改时不用重新编译, 而且不用修改原代码。

在daily build胜行的今天已不是什么太大的优势。

 回复 引用 查看   
#5楼 2006-08-16 22:28 Ring      
@idior
我不觉得daily build现在已经盛行. 起码大部分公司目前还没做到这点.
:-) :-)

 回复 引用 查看   
#6楼 2006-08-17 13:36 Colin Han      
呵呵, idior提出的问题还真热啊。

我觉得这个要具体问题具体分析,
1. 如果变化很频繁的点,比如说:目前因为客户对将来的实现不慎了解,很多问题他也不能确定。或:部署环境比较复杂。
这种情况下,使用配制文件当是上选了。
2. 如果变化不很频繁,紧紧是为了降低耦合度。提高模块的复用度。
使用Attribute应该是比较好的方案,因为强类型。

因此,我认为,往往最佳的方案是Case by Case的组合两种方式。

 回复 引用 查看   
#7楼 2006-08-19 15:12 Teddy's Knowledge Base      
最好还是两者都支持~~
 回复 引用 查看   
#8楼 2006-08-20 11:44 jillzhang      
Attribute VS Configuration
我目前倒是喜欢使用Attribute。
Attribute应该在具体应用能在设计的时候完全枚举或者绝大部分都能枚举的情形下,有人说,软件的需求是变的,怎么会有这种情形呢?但在某些局部环节,这种情形可能出现。采用Attribute可能提高些许Performance
Configuration应用在设计时只能枚举出具体应用情形的极小一部分的时候,采用配置文件,可以大大提高应用系统的扩展性。
是否需要Build不是关键问题。

 回复 引用 查看   
#9楼 2006-08-23 22:25 Gordon Golden Shining      
我也比较喜欢Attribute, 不过现在想,非要用Xml来做Configuration吗?
如果用YAML那种更简单的方式做Configuration可能更好用.

 回复 引用   
#10楼 2007-06-17 21:04 王排[未注册用户]
ぢ嗨藥憮罪ぢ搖頭萬歲/壞娚メ絯(_灬缺鉻戀朲√愛dē豃覺o憇衡泗魪頭/绌魜頭蒂ぐ學襘ミ變帥♀鎵給莪紦。