代码改变世界

和之前的版本相比,昨天Release的Atlas Control Toolkit变化不可谓不大

2006-09-20 02:43 Jeffrey Zhao 阅读(...) 评论(...) 编辑 收藏
  姑且不论增加了4个新的控件,姑且不论Accordion控件的代码和使用都发生了很大变化,这次Atlas Control Toolkit的更新,改变了一些非常基础的地方。

如果使用上一次Release的版本开发,会在项目中引入两个程序集:Microsoft.Web.Atlas.dll和Microsoft.AtlasControlExtender.dll。Microsoft.Web.Atlas.dll是使用Atlas最根本的程序集,自不必说。而Microsoft.AtlasControlExtender.dll则提供了在Atlas Contorl Toolkit的基础上开发Extender时所需要的一些类。从Atlas Contorl Toolkit的基础上开发Extender是推荐的做法。具体来说,开发一个Extender所需要的三个类,XXXDesigner,XXXExtender和XXXProperties是分别继承了Microsoft.AtlasControlExtender.Design.ExtenderControlBaseDesigner<T, K>,Microsoft.AtlasControlExtender.ExtenderControlBase<T, C>和Microsoft.AtlasControlExtender.TargetControlPropertiesBase<C>,它们定义了开发一个Extender所需类的基础,因此大家在开发XXXExtender,XXXDesigner时几乎不用写任何代码。

另外,之前的Atlas Control Toolkit还有一个名为AtlasControlToolkit.dll的程序集,它包含了Atlas Control Toolkit里的大大小小二十多个Extender。

但是继承Microsoft.AtlasControlExtender.dll中那些类自然不是开发一个Extender的必要条件,否则在Atlas Control Toolkit出现之前已经包含在Atlas中的例如AutoCompleteExtender是如何开发的呢?事实上,开发一个Extender所需要的类XXXDesigner,XXXExtender和XXXProperties必须继承的类分别是Microsoft.Web.UI.Design.ExtenderControlDesigner<T>,Microsoft.Web.UI.Controls.ExtenderControl<T>和Microsoft.Web.UI.TargetControlProperties。它们都存在于Microsoft.Web.Atlas.dll中,它们才是基础,这从Atlas自带的Extender例如AutoCompleteExtender或DragOverlayExtender都可以看出(不过事实上,查看的Atlas Control Toolkit里的AccordionDesigner可以发现,它是直接继承了System.Web.UI.Design.ControlDesigner,也就是说,甚至连ExtenderControlDesigner<T>也不需要。不过基于Extender对于设计期的几乎无需支持的特性,似乎这点也应该可以理解)。很明显,它们有的不是Generic Class,而在开发Extender时我们使用的都是Microsoft.AtlasControlExtender.dll中的Generic Class,它们继承了Microsoft.Web.Atlas.dll中的基础类,提供了一些成员,极大地方便了我们对于Extender的开发。

而在昨天的Release中,这些基础发生一些改变。首先可以发现,Microsoft.AtlasControlExtender.dll消失了!那么那些基类都到哪里去了?打开源代码后可以发现,在AtlasControlToolkit项目里多了一个文件夹ExtenderBase,那些基础类都被转移到了这个文件夹下。如果仅仅是这样似乎问题还不是很大,但是如果在以前的项目中引入最新的AtlasControlToolkit.dll后发现以前编写的Extender已经无法编译了!错误提示是找不到Microsoft.AtlasControlExtender等命名空间和ExtenderControlBase等类。查看了Atlas Control Toolkit的源代码之后才发现,原来我们之前用于开发Extender的那些基础类,它们被转移到了别的命名空间。它们已经分别成为了AtlasControlToolkit.Design.ExtenderControlBaseDesigner<T, K>,AtlasControlToolkit.ExtenderControlBase<T, C>和AtlasControlToolkit.TargetControlPropertiesBase<T>。

变化还不止这些,Client Script也有所改变。打开Atlas Control Toolkit的源代码里AtlasControlToolkit项目中ExtenderBase/BaseScripts.js文件可以发现AtlasControlToolkit.BehaviorBase类的定义。这是Behavior的基类,以Tutorial里DisableButton为例,以前DisableButton.DisableButtonBehavior类的继承代码DisableButton.DisableButtonBehavior.registerSealedClass('DisableButton.DisableButtonBehavior', Microsoft.AtlasControlExtender.BehaviorBase)现在就必须改为DisableButton.DisableButtonBehavior.registerSealedClass('DisableButton.DisableButtonBehavior', AtlasControlToolkit.BehaviorBase)了。

查看了一下新的Template,上面提到的地方也已经被相应地改变了。以前如果开发的Extender,最好还是将源代码拿出来修改后重新编译吧。否则,就必须保留以前的程序集一起使用。

总的来说,个人认为这次的改变也有它的一些道理。首先,目前的代码已经完全将所有的类放在了AtlasControlToolkit命名空间下,不会“污染”到“Microsoft.*”命名空间,这对于一个以第三方开源库身份出现的程序集来说不失为一个所需的做法。其次,以前存放在Microsoft.AtlasControlExtender.dll的那些类也被开源了,想看那些源代码的人(比如我)也可以暂时放下手上的Refletor,以一种“光明正大”的姿态阅读那些代码了。:)