这两天来,把国内国外一些在google搜到的关于ioc,aop相关文档看了一部分,其中我把一些转贴在论坛上了,作为资料收集,希望对大家的学习有帮助。(bbs在:http://bbs.wjshome.com,是我的资料收集地)
学了东西总得实践,所以我打算写一系列关于这方面应用的文章。net世界里面,目前很火的就是spring和castle,我这里先就castle的一些应用心得和大家交流交流,因为我觉得castle的易用性比spring强很多,入门也相对比较容易,当然他们的基本观点都是一致,实现的手法不太相同而已,导致表现出一部分的特性也不尽相同,所以学习的时候,基本的IOC思想,AOP实现原理是必须了解的,板块里有详尽的参考资料,花点时间吃透他吧!
当然文中可能有错误的地方,希望大家多多提出批评指教。那么,下面我们就开始吧,从简单到复杂,here we go~~
1) 关于Castle 的 IOC 容器:
●Castle Windsor
Windsor是Castle的IOC容器(built on top of a MicroKernel),包含几个概念:
组件(Component)
服务(Service)
扩张单元插件(Facilities)
我是这样理解他们之间的关系的:组件提供服务,也就是服务是一个个接口,而Facilities提供扩张容器管理组件的能力。我们可以直接使用组件,也可以把组件转换成相应的服务接口来使用。
也可以这么说,Component是普通的组件,Facilities是带有注入性质的组件。
●自动装配(Auto-wiring)
自动装配的意思是指由容器自动管理组件之间的依赖关系,而无需编写特定的xml config来配置依赖关系,spring和castle都支持自动装配,但是spring文档中是不推荐使用自动装配的,castle本身就是自动装配的,这是他们之间一个很大的区别。
spring不推荐自动装配的原因是:手动控制依赖关系让你自知道自己在做什么,有利于规范文档。
而castle作者是这样认为的:不使用自动装配,配置文档极之冗长,当组件配置到一定数目时候,管理起来就非常困难。
对比之下,如果我们要改变一个依赖关系或者增加一个组件依赖,使用Castle是比Spring容易得多的。
●扩张单元(Facilities)
如果你想扩张容器的功能,你可以通过创建扩张单元达到目的。
Castle提供有一系列的扩张单元,你也可以建立自己的扩展单元。这些扩张单元是可以重用的,你可以在扩张单元里面订阅容器事件,给组件附加属性,建立拦截器,控制组件生命周期等。
在spring里面,如果要拓展容器的功能,相信就要实现自己的容器,比如从XmlObjectFactory继承下来,相比之下,Castle是通过一种“插件”的形式达到目的,优势是明显的。
关于Castle提供的Facilities请参见:
http://www.castleproject.org/index.php/Facilities
2) 关于Castle的AOP
AspectSharp 是Castle提供的AOP轻量级框架,AspectSharp是建立在DynamicProxy的基础上,同时Castle提供了AspectSharp 的Facilities使你可以更容易的在IOC容器里面应用Aspect#。
3) Castle Project ActiveRecord
如果你的项目中使用Nhnbernate作为数据库持久层,有了这个你就可以废弃掉hbm.xml文件了,activeRecord通过Attribute来配置持久类,而且配合ActiveRecord Generater可以很方便的生成,管理持久类代码,而不用去找生成机的烦恼。我原本是用CodeSmith写了一个Nhibernate的模板,看来可以丢掉了,不过目前我对ActiveRecord没有更多的尝试。
4) Castle Project DynamicProxy
实现动态代理,在Java里面有专门的库来实现代理,而。net的却没有动态代理的相关库,Castle DynamicProxy来弥补这个不足,他是基于Emit技术的。写本文为止的版本是1.1.0.0,算是很成熟的了。而且AOP,Nhibernate,IBatis都有用到DynamicProxy,了解他是非常重要的,网络上已经有很多介绍DynamicProxy的文章,我会转载在论坛上作为资料收集,了解他是你进行对其他技术研究的基础。
5) Castle Project MonoRail
MonoRail 原名叫Castle on Rails,他涉及到“Action Pack”的概念,具体请参见: http://ap.rubyonrails.org/(MonoRail is an attempt to provide a port of Action Pack for .Net. The Action Pack way of development is extremelly productive, very intuitive and easily testable. )
开篇就先介绍到这吧,下一步就真正实践Casltle了,准备从容器的使用入手,大家可以给意见,多多指教,谢谢。