castle动态代理的使用
转自:https://blog.csdn.net/educast/article/details/6565447#
动态代理的原理
原理其实很简单,就是在运行时生成新的对象,姑且叫做T,并使T继承自需要代理的原对象,调用过程实际是调用了新的对象T.
通过对T中方法或属性等,添加些自定义的操作,从而实现对原对象访问的封装.
动态代理实现(利用castle)
castle的动态代理需要下面几步
- 自定义一个拦截器,必须实现 IInterceptor 接口
- 使用 ProxyGenerator 对象创建代理对象,对象中包含很多方法
- 对原对象的所有操作,都使用代理对象代替
- 在拦截器的方法中,加入自定义的操作,比如 记录参数调用日志,异常记录等.
简单拦截器实现代码: SampleInterceptor.cs
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using Castle.Core.Interceptor;
- using System.Reflection;
- /// <summary>
- /// 拦截器示例
- /// </summary>
- public class SampleInterceptor : IInterceptor
- {
- public SampleInterceptor()
- {
- //
- //TODO: 在此处添加构造函数逻辑
- //
- }
- public void Intercept(IInvocation invocation)
- {
- output("开始进入拦截器");
- MethodInfo concreteMethod = invocation.GetConcreteMethod();
- if (!invocation.MethodInvocationTarget.IsAbstract)
- {
- output("开始执行 " + concreteMethod.Name);
- //执行原对象中的方法
- invocation.Proceed();
- output("执行结果 " + invocation.ReturnValue);
- }
- output("执行完毕");
- }
- private void output(string Message)
- {
- HttpContext.Current.Response.Write(Message + "<br>");
- }
- }
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using Castle.Core.Interceptor;
- using System.Reflection;
- /// <summary>
- /// 拦截器示例
- /// </summary>
- public class SampleInterceptor : IInterceptor
- {
- public SampleInterceptor()
- {
- //
- //TODO: 在此处添加构造函数逻辑
- //
- }
- public void Intercept(IInvocation invocation)
- {
- output("开始进入拦截器");
- MethodInfo concreteMethod = invocation.GetConcreteMethod();
- if (!invocation.MethodInvocationTarget.IsAbstract)
- {
- output("开始执行 " + concreteMethod.Name);
- //执行原对象中的方法
- invocation.Proceed();
- output("执行结果 " + invocation.ReturnValue);
- }
- output("执行完毕");
- }
- private void output(string Message)
- {
- HttpContext.Current.Response.Write(Message + "<br>");
- }
- }
示例中使用的接口 : IPerson.cs
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- /// <summary>
- ///IPerson 的摘要说明
- /// </summary>
- public interface IPerson
- {
- /// <summary>
- /// 姓名
- /// </summary>
- string Name { get; }
- /// <summary>
- /// 地址
- /// </summary>
- string Address { get; }
- /// <summary>
- /// 正在做什么
- /// </summary>
- /// <returns></returns>
- string Doing();
- }
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- /// <summary>
- ///IPerson 的摘要说明
- /// </summary>
- public interface IPerson
- {
- /// <summary>
- /// 姓名
- /// </summary>
- string Name { get; }
- /// <summary>
- /// 地址
- /// </summary>
- string Address { get; }
- /// <summary>
- /// 正在做什么
- /// </summary>
- /// <returns></returns>
- string Doing();
- }
对接口的实现:Person.cs
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- /// <summary>
- ///Person 的摘要说明
- /// </summary>
- public class Person : IPerson
- {
- public Person()
- {
- //
- //TODO: 在此处添加构造函数逻辑
- //
- }
- #region IPerson 成员
- public string Name
- {
- get { return "我是花生米"; }
- }
- public string Address
- {
- get { return "我住在 http://pignut-wang.iteye.com/ "; }
- }
- public string Doing()
- {
- return "我正在写blog";
- }
- #endregion
- }
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- /// <summary>
- ///Person 的摘要说明
- /// </summary>
- public class Person : IPerson
- {
- public Person()
- {
- //
- //TODO: 在此处添加构造函数逻辑
- //
- }
- #region IPerson 成员
- public string Name
- {
- get { return "我是花生米"; }
- }
- public string Address
- {
- get { return "我住在 http://pignut-wang.iteye.com/ "; }
- }
- public string Doing()
- {
- return "我正在写blog";
- }
- #endregion
- }
所有要使用到的对象都准备好了,下面就是调用的代码
- using System;
- using System.Configuration;
- using System.Data;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using Castle.DynamicProxy;
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //创建拦截器对象
- SampleInterceptor Interceptor = new SampleInterceptor();
- //给person类生成代理
- ProxyGenerator Generator = new ProxyGenerator();
- IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);
- //执行方法看效果
- p.Doing();
- }
- }
- using System;
- using System.Configuration;
- using System.Data;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using Castle.DynamicProxy;
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- //创建拦截器对象
- SampleInterceptor Interceptor = new SampleInterceptor();
- //给person类生成代理
- ProxyGenerator Generator = new ProxyGenerator();
- IPerson p = Generator.CreateInterfaceProxyWithTarget<IPerson>(new Person(), Interceptor);
- //执行方法看效果
- p.Doing();
- }
- }
执行的效果就是在页面上输出4句话,如下
开始进入拦截器
开始执行 Doing
执行结果 我正在写blog
执行完毕
castle动态代理的使用的更多相关文章
- Castle动态代理拦截
比如现在有一个方法,进行积分奖励 PointAdd 在不改变原来方法的基础上,增加积分奖励的日志 using Castle.DynamicProxy; public class AuditTraceI ...
- Aop之使用Castle动态代理实现对方法的拦截
using System; using System.Linq; using Castle.DynamicProxy; namespace AopTest { class AopTest { stat ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- castle之动态代理
动态代理 DynamicProxy,这里说的动态代理是直接使用Castle.net 中提供的,并非自己实现的,因为别人写的很好,拿着用就行了. 动态代理的工作模式: 一般我们获取一个类型的实例都是通过 ...
- Castle Windsor 的动态代理类如何获取实际类型
问题 在实际开发过程当中我们可能会针对某些类型使用动态代理技术(AOP),注入了一些拦截器进行处理,但是一旦某个类型被动态代理了,那么就会生成一个代理类.这个时候在该类内部使用 GetType() 方 ...
- ASP.NET Core搭建多层网站架构【9.2-使用Castle.Core实现动态代理拦截器】
2020/01/31, ASP.NET Core 3.1, VS2019, Autofac.Extras.DynamicProxy 4.5.0, Castle.Core.AsyncIntercepto ...
- 不用Unity库,利用.NET动态代理自己实现AOP
AOP意为面向切面的程序设计,主要表现为对不同的代码逻辑进行隔离,从而降低不同业务逻辑之间的耦合性,AOP又理解为“横切”,可以在不改变原有实现的情况下,对代码进行拦截和扩展,如果原有设计像一个瓶子, ...
- Autofac高级用法之动态代理
前言 Autofac的DynamicProxy来自老牌的Castle项目.DynamicProxy(以下称为动态代理)起作用主要是为我们的类生成一个代理类,这个代理类可以在我们调用原本类的方法之前,调 ...
- 5.动态代理AOP实现-DynamicProxy模式
通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...
随机推荐
- carson常用linux命令整理
注:通过日常所用到的一些命令进行整理添加!! 完整的命令可参考:Linux命令大全 1.cp命令 cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录. 2.mount(挂载)命令 在li ...
- adminlte前端框架从入门到精通
第一 下载 admintle的下载地址为: https://github.com/almasaeed2010/AdminLTE/releases 参考实例文件代码: 例如:AdminLTE-2.4.3 ...
- html的表格 table
創建表格: 每一個表格以table開始: 每一個表格行以tr開始: 每一個數據以td開始:td的內容可以文本.圖像.表格.表單.段落等. 表格邊框: border設置邊框的粗細,但無法設置行間距,也無 ...
- BZOJ2002[Hnoi2010]弹飞绵羊——LCT
题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...
- python 模块和包
一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...
- 【BZOJ2302】[HAOI2011]Problem C(动态规划)
[BZOJ2302][HAOI2011]Problem C(动态规划) 题面 BZOJ 洛谷 题解 首先如果\(m=0\)即没有特殊限制的话,那么就和这道题目基本上是一样的. 然而这题也有属于这题的性 ...
- luogu2577/bzoj1899 午餐 (贪心+dp)
首先,应该尽量让吃饭慢的排在前面,先按这个排个序 然后再来决定每个人到底去哪边 设f[i][j]是做到了第i个人,然后1号窗口目前的总排队时间是j,目前的最大总时间 有这个i和j的话,再预处理出前i个 ...
- centos6.5重新调整/home和跟目录/大小
0. 说明 系统刚刚安装完之后,默认到/home有1.5TiB,而根分区只有200G.现在是要将VolGroup-lv_home缩小到200G,并将剩余的空间添加给VolGroup-lv_root. ...
- 洛谷P3953 逛公园
DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...
- Java:判断当前操作系统界面采用的主题是windows经典样式还是xp样式
想起两三年前,发现写Java界面的时候,如果将当前界面的layout设为null,由于windows的不同主题界面下,标题栏的高度不一致,导致当前界面表现也不一致. 当时就想找到一个办法先判断当前用户 ...