RogerTong's Tech Space

文章书傲骨,程序写春秋

导航

2008年7月9日

摘要: 熟悉Castle的朋友一定清楚:在Castle体系中,有一个叫Aspect#的子项目。Aspect#是一个AOP的框架,在这篇文章中,我并不打算直接开始讲Aspect#,因为Aspect#的封装过于完善,不太利于用来讲述AOP的具体实现细节。其实Aspect#的基础是 DynamicProxy,所以,我们先来讲讲DynamicProxy。 在很多朋友的眼中,AOP似乎是一个很神秘的东西,其实在我看来,AOP的本质就是对一切操作行为的拦截,在.Net中,AOP的本质更简单,纯粹是对方法的拦截。为什么这么说呢?因为在.Net中,一切的操作都是方法调用:事件的 “+=” 及 “-=”最终被转换为 Addxxxx(...),Removexxxxx(...)类型的方法;属性的 get/set 过程也被转换为 getxxxxxx(...),setxxxxxx(...)类型的方法;而方法的本身就更不用说了…… 阅读全文

posted @ 2008-07-09 16:42 RogerTong 阅读(3880) 评论(3) 推荐(0) 编辑

摘要: 这是一个曾被热烈的讨论过的问题。之所以忽然谈起这个... 阅读全文

posted @ 2008-07-09 16:42 RogerTong 阅读(1230) 评论(2) 推荐(0) 编辑

摘要: 在上一篇文章中,我们讲过如何从外部调用插件项目,接下来我们来看看插件项目与插件项目之间的调用。 我们来看看现在的应用场景:同样是对两个数值进行运算,MathOne是基本并且稳定的运算服务,负责对这两个数据相加并返回值。但是由于新的用户的需求发生了改变,他们希望获得的值是MathOne结果的平方数,例如: 如果我们传入的值是 (2,3),旧用户期望得到的值是 2+3 = 5 ,而新用户期望的值是 MathOne 运算结果的平方数,即是 5 2 = 25。 由于需要同时考虑新的需求并兼容旧的用户,所以我们需要加多一个插件项来为新用户响应需求。 为了让大家看起来不那么吃力,我们还是重述一下相关的接口及 MathOne 的实现 阅读全文

posted @ 2008-07-09 16:40 RogerTong 阅读(445) 评论(0) 推荐(0) 编辑

摘要: 在之前的文章中,我们已经了解了Mussel插件项目树的结构及插件简单的制作方式,今天我们来看看如何对Mussel的插件项目进行调用。 我们想像一下有这样的一个应用场景:我们需要对两个数值运算并返回一个结果,这个运算交由一个独立的运算过程来进行,我们并不关心运算的具体细节,我们只需要运算过程返回一个结果,先来看看这个运算接口的定义 阅读全文

posted @ 2008-07-09 16:39 RogerTong 阅读(362) 评论(0) 推荐(0) 编辑

摘要: 在之前的文章中我们提到了Mussel插件的层次结构:插件(Addin)包括了插件项目的装载节点(AddinNode),装载节点又包括了插件项目(AddinItem),而每个插件项目又可以包括无限下级的子项目: Mussel的加载器在加载时,会尝试读取当前文件夹以下(包含子文件夹)的所有*.addin文件,每个addin文件被Mussel加载器识别、加载后,便会形成如上图所示的IAddin对象,如果每个插件都是独立的,这个过程就非常简单。但是插件之间必须然会有一些联系,例如,如果系统的工具栏是一个稳定的插件(addin),如果金山词霸有一个扩展,能添加一个按钮到系统的工具栏中,我们先来看看摸拟的配置文件,为了方便说明,我们假定 ClassKey指示的类型都存在并忽略掉程序集引入的配置部分。 阅读全文

posted @ 2008-07-09 16:26 RogerTong 阅读(474) 评论(0) 推荐(0) 编辑

摘要: Mussel插件项目都从AddinItem继承,AddinItem类是所有插件项目的基类,附合IAddinItem接口规范,我们先来看看IAddinItem接口的构成类图: 上图是IAddinItem接口的全部方法与属性,从前三个属性中,我们不难看出Addin插件树的组成方式,可以想像的是AddinNode中自然还包插了IAddin的对像。 Properties属性是插件加载时,从Addin配置文件中读取的对应的AddinItem的配置信息。而通过this属性可以轻松的访问到当前插件项目的子插件项目…… 阅读全文

posted @ 2008-07-09 16:11 RogerTong 阅读(459) 评论(0) 推荐(0) 编辑

摘要: 在前面的文章中,我们说过,Mussel的内核是一个插件容器。Mussel本身不提供任何功能上的服务,所有的功能都由插件来提供。Mussel负责协调插件与插件、插件与容器以及容器与调用者之间的通信。 Mussel提供了一个装载器,这个在以后的文章中会讲到。装载器的Start方法调用时,装载器遍历Mussel程序集所在文件夹以及所有的子文件夹,搜寻 *.addin 的插件配置文件。在这里,我们先看一个addin文件的演示…… 阅读全文

posted @ 2008-07-09 15:42 RogerTong 阅读(680) 评论(1) 推荐(0) 编辑

摘要: 使用.Net开发已经有近三年的时间了,深刻感受到.Net给软件开发思想带来的巨大的变化。.Net一些独特的语法元素(如特性、委托等等)以及对线程、Domain等概念的完美的支持,无疑为软件架构师提供了巨大的设计优势。 从使用.Net的第一天起,我就一直期望能设计一个符合小组使用,通过简单配置即可协调好程序集之间相互作用的一套轻量级框架,在对Castle、PostSharp、NHibernate等... 阅读全文

posted @ 2008-07-09 15:32 RogerTong 阅读(829) 评论(0) 推荐(0) 编辑