技术开发 频道

Castle 的 IOC 容器


【IT168技术文档】


  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可以很方便的生成,管理持久类代码,而不用去找生成机的烦恼。
  4)Castle Project DynamicProxy
  实现动态代理,在Java里面有专门的库来实现代理,而。net的却没有动态代理的相关库,Castle DynamicProxy来弥补这个不足,他是基于Emit技术的。而且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. )
  Inversion of Control 反转控制介绍
  什么是IOC?IOC是一个简单的原则,它规定一个外部实体应该发送信息给编程者的对象从而执行一些特定的操作或者允许编程者能够覆盖某些逻辑。这是API和框架最主要的区别。我们现在举两个例子,第一个例子,你的对象通过API(主动方式)进行对象调用;另一个是采用框架调用你的对象,你的对象处理被动方式。
  下面的例子是反转控制解决松偶合问题其中一方面:怎样使你的类得到一个外部对象引用或配置。
using System; using System.Configuration; public class MyAwfulEmailClass { public MyAwfulEmailClass() { } public void SendEmail( String from, String to, String message, String templateName ) { String host = ConfigurationSettings.AppSettings["smtphost"]; int port = Convert.ToInt( ConfigurationSettings.AppSettings["smtpport"] ); NVelocityTemplateEngine engine = new NVelocityTemplateEngine(); String newMessage = engine.Process( message, templateName ); // Finally send message... } }
0
相关文章