2012-11-09 16:51 4207人阅读 评论(1) 收藏 举报
 分类:
OO(17) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

目录(?)[+]

 

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的代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace CastleAOPTest.Lib
  6. {
  7. public class Person
  8. {
  9. public virtual void SayHello()
  10. {
  11. Console.WriteLine("您好!");
  12. }
  13. public virtual void SayName(string pHometown)
  14. {
  15. Console.WriteLine("我是天涯人,我来自:{0}。", pHometown);
  16. }
  17. public void SayOther()
  18. {
  19. Console.WriteLine("是的,我是中国人。");
  20. }
  21. }
  22. }

这个类型没什么好说的,只是输出一些字符串而以。

惟一需要注意的是:前两个方法都是虚方法,而“SayOther”不是虚方法,即是说“SayOther”不可以用一般的方式重载。

方法拦载器CastleAOPTest.Lib.AOP.SimpleInterceptor的代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using CastleAOPTest.Lib;
  6. using Castle.DynamicProxy;
  7. namespace CastleAOPTest.Lib.AOP
  8. {
  9. public class SimpleInterceptor : StandardInterceptor
  10. {
  11. protected override void PreProceed(IInvocation invocation)
  12. {
  13. Console.WriteLine("调用前的拦截器,方法名是:{0}。", invocation.Method.Name);
  14. base.PreProceed(invocation);
  15. }
  16. protected override void PerformProceed(IInvocation invocation)
  17. {
  18. Console.WriteLine("拦截的方法返回时调用的拦截器,方法名是:{0}。", invocation.Method.Name);
  19. base.PerformProceed(invocation);
  20. }
  21. protected override void PostProceed(IInvocation invocation)
  22. {
  23. Console.WriteLine("调用后的拦截器,方法名是:{0}。", invocation.Method.Name);
  24. base.PostProceed(invocation);
  25. }
  26. }
  27. }

Castle DynamicProxy提供了一个标准的方法拦截器,在一般的情况下,从这个标准的拦截器继承便可以完成大部分方法拦载上面的需求。

StandardInterceptor中提供了三个可重载的方法:

1.PreProcced,在进入拦截的方法之前调用。

2.PerformProceed,在拦截的方法返回时调用。

3.PostProcced,在拦截的方法运行完成后调用。

如何使用这个写好的拦截器

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Castle.DynamicProxy;
  6. using CastleAOPTest.Lib;
  7. using CastleAOPTest.Lib.AOP;
  8. namespace CastleAOPTest.Run
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. ProxyGenerator generator = new ProxyGenerator();//实例化【代理类生成器】
  15. SimpleInterceptor interceptor = new SimpleInterceptor();//实例化【拦截器】
  16. //使用【代理类生成器】创建Person对象,而不是使用new关键字来实例化
  17. Person person = generator.CreateClassProxy<Person>(interceptor);
  18. Console.WriteLine("当前类型:{0},父类型:{1}",person.GetType(), person.GetType().BaseType);
  19. Console.WriteLine();
  20. person.SayHello();//跟普通调用没有两样吧?
  21. Console.WriteLine();
  22. person.SayName("福建");//跟普通调用没有两样吧?
  23. Console.WriteLine();
  24. person.SayOther();//它不是虚方法,无法拦截。待会检测输出情况就知道了。
  25. Console.ReadLine();
  26. }
  27. }
  28. }

ProxyGenerator其实是一个动态的类型构造器,它依据Person类型,并加入相应的拦载器构造出了一个新的类型,我们来查看一下运行输出:

根据输出的第一行,我们可以知道,ProxyGenerator构造了一个新的类型,这个类型继承自Person。

由于这个类型的SayOther方法不可以被子类重载,所以这个方法无法被拦截。

Castle的更多相关文章

  1. Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...

  2. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

  3. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  4. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  5. MVC Castle依赖注入实现代码

    1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...

  6. 避免Castle Windsor引起的内存泄露

    原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...

  7. Castle中AdditionalInterfaces用法介绍

    首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...

  8. Castle.ActiveRecord多数据库配置

    最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...

  9. Castle Windsor常用介绍以及其在ABP项目的应用介绍

    最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...

  10. 基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)

    本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在w ...

随机推荐

  1. PHP输出缓冲控制

    说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会 向磁盘写入的,而是写到buffer中,当buffer写 ...

  2. 【LeetCode OJ】Sum Root to Leaf Numbers

    # Definition for a binary tree node # class TreeNode: # def __init__(self, x): # self.val = x # self ...

  3. [图论]Floyd 算法小结

    Floyd 算法小结  By Wine93 2013.11 1. Floyd算法简介 Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图, 效率要高于执行 ...

  4. Ubuntu14.04 64位运行32位程序

    最近公司新增的机器安装Ubuntu14.04 64bit导致之前在32bit下编译的Qt工具软件无法运行. 于是google的了一下找到一些解决办法,但不能保证全部32bit的Qt程序都能正常,测试了 ...

  5. BLP模型

    编号:1002时间:2016年3月29日16:24:33功能:多级安全BLP模型 URL:http://blog.csdn.net/longronglin/article/details/150033 ...

  6. break return

    用 break  跳出循环 用 return 跳出函数 用 continue 结束本次循环开始下次循环

  7. bold, big, blink

  8. 消格子时一个很深的bug的修复纪录

    环境: cocos2d-x 2.2.2  jsb   条件:当快速在格子中来回拖拽选取时,会一直在计算指尖和格子的真实区域是否碰撞,   报错:touchMOve时由于不停的调用BOxItem的get ...

  9. 命令行创建畸形文件夹+畸形目录管理工具(DeformityPath)

    命令行创建畸形文件夹: 第一步:在运行中输入cmd,回车,打开命令行窗口 第二步:在命令行窗口中切换到想要建立文件夹的硬盘分区,如D盘(输入d:) 第三步:输入 MD 123..\ 回车,注意文件夹名 ...

  10. 正则表达式入门教程&&经典Javascript正则表达式(share)

    前言 例子: ^.+@.+\\..+$ 这样的代码曾经多次把我自己给吓退过.可能很多人也是被这样的代码给吓跑的吧.继续阅读本文将让你也可以自由应用这样的代码. 正文 教程:正则表达式30分钟入门教程 ...