Castle

版权声明:本文为博主原创文章,未经博主允许不得转载。
Castle的相关网站:
http://www.castleproject.org/
http://www.castleproject.org/projects/dynamicproxy/
http://sourceforge.net/projects/castleproject/
在Castle的2.5以上版本,已经将 Castle.DynamicProxy2.dll 里有内容,集成到 Castle.Core.dll 中。
所以,朋友们,不需要再去哪里找Castle.DynamicProxy2.dll了。
当然,除非你使用低于2.5的版本。
本文使用的Castle.Core.dll是3.1版本。
由于方法的拦载是动态构建类型,所以我们在拦截类方法时,可以采取用动态构造类的方式,从该类继承一个子类,重载并改写类中需要拦截的方法。
因此,我们不难理解,为什么在Castle 的 AOP中实现对类方法的拦截,都需要该类中的可被拦载的方法都是能够被子类重载的(override)。
CastleAOPTest.Lib.Person的代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace CastleAOPTest.Lib
- {
- public class Person
- {
- public virtual void SayHello()
- {
- Console.WriteLine("您好!");
- }
- public virtual void SayName(string pHometown)
- {
- Console.WriteLine("我是天涯人,我来自:{0}。", pHometown);
- }
- public void SayOther()
- {
- Console.WriteLine("是的,我是中国人。");
- }
- }
- }
这个类型没什么好说的,只是输出一些字符串而以。
惟一需要注意的是:前两个方法都是虚方法,而“SayOther”不是虚方法,即是说“SayOther”不可以用一般的方式重载。
方法拦载器CastleAOPTest.Lib.AOP.SimpleInterceptor的代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using CastleAOPTest.Lib;
- using Castle.DynamicProxy;
- namespace CastleAOPTest.Lib.AOP
- {
- public class SimpleInterceptor : StandardInterceptor
- {
- protected override void PreProceed(IInvocation invocation)
- {
- Console.WriteLine("调用前的拦截器,方法名是:{0}。", invocation.Method.Name);
- base.PreProceed(invocation);
- }
- protected override void PerformProceed(IInvocation invocation)
- {
- Console.WriteLine("拦截的方法返回时调用的拦截器,方法名是:{0}。", invocation.Method.Name);
- base.PerformProceed(invocation);
- }
- protected override void PostProceed(IInvocation invocation)
- {
- Console.WriteLine("调用后的拦截器,方法名是:{0}。", invocation.Method.Name);
- base.PostProceed(invocation);
- }
- }
- }
Castle DynamicProxy提供了一个标准的方法拦截器,在一般的情况下,从这个标准的拦截器继承便可以完成大部分方法拦载上面的需求。
StandardInterceptor中提供了三个可重载的方法:
1.PreProcced,在进入拦截的方法之前调用。
2.PerformProceed,在拦截的方法返回时调用。
3.PostProcced,在拦截的方法运行完成后调用。
如何使用这个写好的拦截器
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Castle.DynamicProxy;
- using CastleAOPTest.Lib;
- using CastleAOPTest.Lib.AOP;
- namespace CastleAOPTest.Run
- {
- class Program
- {
- static void Main(string[] args)
- {
- ProxyGenerator generator = new ProxyGenerator();//实例化【代理类生成器】
- SimpleInterceptor interceptor = new SimpleInterceptor();//实例化【拦截器】
- //使用【代理类生成器】创建Person对象,而不是使用new关键字来实例化
- Person person = generator.CreateClassProxy<Person>(interceptor);
- Console.WriteLine("当前类型:{0},父类型:{1}",person.GetType(), person.GetType().BaseType);
- Console.WriteLine();
- person.SayHello();//跟普通调用没有两样吧?
- Console.WriteLine();
- person.SayName("福建");//跟普通调用没有两样吧?
- Console.WriteLine();
- person.SayOther();//它不是虚方法,无法拦截。待会检测输出情况就知道了。
- Console.ReadLine();
- }
- }
- }
ProxyGenerator其实是一个动态的类型构造器,它依据Person类型,并加入相应的拦载器构造出了一个新的类型,我们来查看一下运行输出:

根据输出的第一行,我们可以知道,ProxyGenerator构造了一个新的类型,这个类型继承自Person。
由于这个类型的SayOther方法不可以被子类重载,所以这个方法无法被拦截。
Castle的更多相关文章
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- MVC Castle依赖注入实现代码
1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- Castle中AdditionalInterfaces用法介绍
首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...
- Castle.ActiveRecord多数据库配置
最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...
- Castle Windsor常用介绍以及其在ABP项目的应用介绍
最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...
- 基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)
本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在w ...
随机推荐
- Ogre 1.8 terrain 和 paging 组件
以下转自:http://hi.baidu.com/xocoder/item/e8d87cf53d87612b753c4cfd OGRE地形生成 OGRE可以通过两个接口来生成地形,分别是void Te ...
- 技术分享:如何用Solr搭建大数据查询平台
0×00 开头照例扯淡 自从各种脱裤门事件开始层出不穷,在下就学乖了,各个地方的密码全都改成不一样的,重要帐号的密码定期更换,生怕被人社出祖宗十八代的我,甚至开始用起了假名字,我给自己起一新网名”兴才 ...
- Android如何分析和研究Monkey Log文件
Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 . 什么时候会有Log文件的产生 ...
- css 时钟
(转自:http://www.cnblogs.com/Wenwang/archive/2011/09/21/2184102.html) <!DOCTYPE html> <html l ...
- aspx页面图片用作html中img的url
背景:如果无法直接访问保存图片的服务器,我们可以先制作一个aspx页面用来接受服务器发送过来的图片,然后html页面请求aspx页面.对图片服务器起一定的缓冲保护作用,预防对黑客攻击造成危害. 注意: ...
- HDU 1005 Number Sequence(AC代码)
#include <stdio.h> #include <string.h> int main() { int a,b,n; int i; ]={}; f[]=; f[]=; ...
- 添加mongodb支持
最近花了些时间,将引擎的存储换成了mongodb. 私下,我觉得现有的存储机制极为落后.现在写数据的操作交由单独的进程完成,该进程兼当数据缓冲与持续化数据的责任.此次引擎的更换,只是简单的利用mong ...
- FHS目录配置下,常见的几个问题及解答
请说明/bin与/usr/bin目录所放置的执行文件有何不同之处? /bin主要放置在开机时,以及进入单人维护模式后还能够被使用的指令,至于/usr/bin则是大部分软件提供的指令放置处. 请说明/b ...
- ME23N PO 打印预览 打印问题
ME23N进入PO订单,点message查看订单打印的配置 点message查看订单打印的配置 然后spro查看 选择相应的outputtype,然后双击processing routines 可以看 ...
- WebRTC录音(2)-录音文件转换成WAV格式
以下是源码,大路货,从网上找的. 但是,这个东西在MacOS上是有问题的,原因在最后,都是泪啊. #include <stdio.h> #include <string.h> ...