RogerTong's Tech Space

文章书傲骨,程序写春秋
posts - 15, comments - 67, trackbacks - 0, articles - 0

2008年10月11日

摘要: 在前面的章节中,我们了解了如何通过DynamicProxy来实现对接口调用的拦截,在今天的实例中,我们将会看到一个具体的应用。 在我们所开发软件系统中,权限鉴别是一个非常重要的部分。通常在具体的需要权限访问的方法中,我们需要加入大段的代码来校验当前用户是否有权限操作当前的方法中的一些环节,不仅如此,我们甚至于还需要在方法的签名中加入相关的可代表用户身份的信息,例如: void DoOperationxx(string userId,string param1,string param2).. 在这个方法中,可能实际需要用到的参数只是"string param1,string param2",但是我们加入userId 的参数,纯粹只是为了鉴别当前用户是否有权限访问而以,导致我们的代码显得非常的冗余。阅读全文

posted @ 2008-10-11 12:54 RogerTong 阅读(2024) 评论(5) 编辑

2008年7月14日

摘要: 在前面的章节中,我们了解到Mussel是一个基于插件的应用框架。Mussel内核的本身不包含任何方面的功能,它只是负责对我们所编写的插件项目进行协调,维护起插件项目之间的依赖关起,并构建起插件项目之间的沟通渠道。通过编写各种不同的应用插件,我们可以无限的扩展Mussel的功能。同时,Mussel还可以按照用户指定的需求在进程中开辟不同的AppDomain,将不同职能的插件载入不同的AppDomain中,亦可以将相类似职能的不同插件加入到同一个AppDomain。在今天的讲述中,我们将看到如何利用Mussel默认提供的通信及Proxy生成器插件来开发一个简单的 C/S(客户端/服务器)应用阅读全文

posted @ 2008-07-14 23:10 RogerTong 阅读(1319) 评论(16) 编辑

2008年7月12日

摘要: 继续我们上一章的讲解。现在我们用一个具体的程序示例来演示我们插件的加载及卸载过程,我们先回顾一下上一章中我们总结出来的一些思路:


1. 建立一个新的AppDomain: AppDomain.CreateDomain()。
2. 利用的AppDomain的实例,采用 CreateInstanceFromAndUnwrap() 方法在新的AppDomain中构建一个指定的类型,并返回相应的Proxy。
3. 根据获取的Proxy就可调用插件了。
4. 卸载时,完成一些资源清理后可以直接对新建出的AppDomain进行UnLoad
阅读全文

posted @ 2008-07-12 10:21 RogerTong 阅读(1727) 评论(9) 编辑

摘要: 在过去几年时间里,我一直都只是在看别人写的东西,属于那种典型的“看贴不回贴”的一类。自我感觉似乎这些编程语言社区与我没有太大的关系。总是在一些对问题摸不着头脑、急得只能干瞪眼时才想起来有这么一些积累了别人经验教训的地方,这个时候别人的博客文章,社区里面的一些技术文献便成了我救命的稻草。一直在社区中吸取营养,却未能给这片土地带来什么有价值的东西,呵呵,说起来真是惭愧!前段时间...阅读全文

posted @ 2008-07-12 03:08 RogerTong 阅读(1552) 评论(16) 编辑

2008年7月11日

摘要: 在软件开发的领域中,插件技术一直是一项非常实用的技术。许多优秀的软件产品都提供了通过加载插件来扩展、丰富产品本身功能的能力。而像Firefox、 Eclipse之类的软件,更是将插件的功能发挥到了极致。顺便做点广告的是,我们的Mussel框架便是一套基于插件扩充应用功能的框架:),在这里我们来分析一下.Net中常用的插件技术……阅读全文

posted @ 2008-07-11 20:24 RogerTong 阅读(2088) 评论(9) 编辑

posted @ 2008-07-11 14:09 RogerTong 阅读(2049) 评论(5) 编辑

2008年7月10日

摘要: Castle中有一个扩展的DynamicProxy程序集(DynamicProxy2),在这个程序集中,提供了对接口方法做动态拦截的能力。相比于对类方法的拦截,对接口方法的拦截为我们的架构设计方面提供了更大的自由度。在这里先罗列一些简单的代码,大家可以从这些代码中先思考一下接口方法的动态拦截可以应用于哪些方面,在以后的章节中,我们会深入的讨论具体的应用层面,其实这个在我们Mussel通信层的插件的实施中,于客户端产生服务端接口的 Proxy起到了决定性的作用……阅读全文

posted @ 2008-07-10 11:59 RogerTong 阅读(2427) 评论(1) 编辑

2008年7月9日

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

posted @ 2008-07-09 16:42 RogerTong 阅读(704) 评论(2) 编辑

摘要: 熟悉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 阅读(2455) 评论(3) 编辑

摘要: 在上一篇文章中,我们讲过如何从外部调用插件项目,接下来我们来看看插件项目与插件项目之间的调用。

我们来看看现在的应用场景:同样是对两个数值进行运算,MathOne是基本并且稳定的运算服务,负责对这两个数据相加并返回值。但是由于新的用户的需求发生了改变,他们希望获得的值是MathOne结果的平方数,例如:

如果我们传入的值是 (2,3),旧用户期望得到的值是 2+3 = 5 ,而新用户期望的值是 MathOne 运算结果的平方数,即是 5 2 = 25。

由于需要同时考虑新的需求并兼容旧的用户,所以我们需要加多一个插件项来为新用户响应需求。

为了让大家看起来不那么吃力,我们还是重述一下相关的接口及 MathOne 的实现阅读全文

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