首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
ASP | ASP.NET | JSP | PHP | AJAX | XML | Java script | HTML/CSS | 服务器类
各大城市软件开发培训、软件人才免费咨询热线:400-700-5807
 您现在的位置: 中国IT实验室 >> WEB开发 >> asp学习教程 >> 正文
AspectSharp 中的代理对象全接触
ChinaItLab  2004-9-9  保存本文    收藏本站


  代理对象是AOP动态截入的关键部分. 下面来分析一下代理对象是如何定义的.
  
  1. CreateProxyType
  internal static Type CreateProxyType(Type[] interfaces, IMixin[] mixins) {
  //...
  AssemblyName assemblyName = new AssemblyName();
  assemblyName.Name = "DynamicAssemblyProxyGen";
  
  AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
  assemblyName, AssemblyBuilderAccess.Run);
  // 以指定名称和访问模式定义动态程序集, 这里以运行模式建立程序集.
  
  ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule( assemblyName.Name, true );
  // 在动态程序集中定义动态模块, 第二个参数发出符号信息.
  
  TypeBuilder typeBuilder = moduleBuilder.DefineType( "ProxyType",
  TypeAttributes.Public|TypeAttributes.Class, null, MergeTypes(interfaces, mixins) );
  // 定义一个类类型, 此类为public, 且实现所有的interfaces和mixins接口,
  // MergeTypes用于将interfaces和mixins合并为一个Type[].
  
  FieldBuilder handlerField = GenerateField( typeBuilder, handlerFieldName, typeof(IInvocationHandler) );
  // 产生一个IInvocationHandler字段. 等同于 public IInvocationHandler handler;
  
  FieldBuilder mixinHandlerField = GenerateField( typeBuilder, mixinHandlerFieldName,
  typeof(IMixinInvocationHandler) );
  // 产生一个IMixinInvocation字段. 等同于 public IMixinInvocationHandler mixinHandler;
  
  FieldBuilder mixinsField = GenerateField( typeBuilder, "mixins", typeof(IMixin[]) );
  // 产生一个IMixin[]字段, 等同于 public IMixin[] mixins;
  
  ConstructorBuilder constr = GenerateConstructor( typeBuilder, handlerField, mixinsField, mixinHandlerField );
  // 产生一个构造方法.
  
  GenerateInterfaceImplementation( typeBuilder, interfaces, handlerField );
  // 产生接口的实现部分.
  
  GenerateMixinImplementation( typeBuilder, mixins, mixinHandlerField, mixinsField);
  // 产生混合器接口的实现部分.
  }
  
  2. GenerateConstructor
  private static ConstructorBuilder GenerateConstructor( TypeBuilder typeBuilder,
  FieldBuilder handlerField, FieldBuilder mixinsField, FieldBuilder mixinHandlerField ) {
  ConstructorBuilder consBuilder = typeBuilder.DefineConstructor(
  MethodAttributes.Public,
  CallingConventions.Standard,
  new Type[] { typeof(IInvocationHandler), typeof(IMixinInvocationHandler), typeof(IMixin[]) } );
  
  // 定义一个构造方法, 指定方法修饰为Public, 调用约定为Standard.
  // 等同于 public ProxyType( IInvocationHandler handler, IMixinInvocationHandler mixinHandler, IMixin[] mixins );
  
  ILGenerator ilGenerator = consBuilder.GetILGenerator();
  // 取得IL产生器. 用于生成IL代码.
  
  ilGenerator.Emit(OpCodes.Ldarg_0);
  ilGenerator.Emit(OpCodes.Call, typeof(Object).GetConstructor(new Type[0]));
  // 调用Object类型的默认构造函数, 等同于 public ProxyType(...) : base()
  
  // handler
  ilGenerator.Emit(OpCodes.Ldarg_0);
  ilGenerator.Emit(OpCodes.Ldarg_1);
  ilGenerator.Emit(OpCodes.Stfld, handlerField);
  // 对handlerField字段进行赋值, 等同于 this.handler = handler;
  
  // mixinHandler
  ilGenerator.Emit(OpCodes.Ldarg_0);
  ilGenerator.Emit(OpCodes.Ldarg_2);
  ilGenerator.Emit(OpCodes.Stfld, mixinHandlerField);
  // 对mixinHandlerField字段进行赋值, 等同于 this.mixinHandler = mixinHandler;
  
  // mixins
  ilGenerator.Emit(OpCodes.Ldarg_0);
  ilGenerator.Emit(OpCodes.Ldarg_3);
  ilGenerator.Emit(OpCodes.Stfld, mixinsField);
  // 对mixinsField字段进行赋值, 等同于 this.mixins = mixins
  
  ilGenerator.Emit(OpCodes.Ret);
  
  return consBuilder;
  }
  
  代理对象的构造方法类似如下:
  
  public Class ProxyType : 对象接口, 混合器接口 {
  private IInvocationHandler handler;
  private IMixinvocationHandler mixinHandler;
  private IMixin[] mixins;
  
  public public ProxyType( IInvocationHandler handler,
  IMixinInvocationHandler mixinHandler, IMixin[] mixins );  {
  this.handler = handler;
  this.mixinHandler = mixinHandler;
  this.mixins = mixins;
  }
  
  // ...
  }
  
  3. 产生接口的实现部分
  
  static void GenerateInterfaceImplementation( TypeBuilder typeBuilder,
  Type[] interfaces, FieldBuilder handlerField ) {
  foreach(Type inter in interfaces) {
  GenerateInterfaceImplementation( typeBuilder, inter, handlerField, null, -1 );
  }
  // 遍历所有接口.
  }
  
  private static void GenerateMixinImplementation( TypeBuilder typeBuilder,
  IMixin[] mixins, FieldBuilder mixinHandlerField, FieldBuilder mixinsField) {
  if (mixins == null) return;
  
  for(int i = 0; i < mixins.Length; i++) {
  Type[] interfaces = mixins[i].GetType().GetInterfaces();
  
  foreach(Type inter in interfaces) {
  GenerateInterfaceImplementation( typeBuilder, inter, mixinHandlerField, mixinsField, i );
  }
  }
  // 遍历所有的混合器接口
  }
  
  static void GenerateInterfaceImplementation( TypeBuilder typeBuilder,
  Type inter, FieldBuilder handlerField, FieldBuilder mixinsField, int mixinPosition) {
  // ...
  
  Type[] baseInterfaces = inter.FindInterfaces( new TypeFilter( NoFilterImpl ), inter );
  GenerateInterfaceImplementation( typeBuilder, baseInterfaces, handlerField);
  // 这是一个递归过程, 用于遍历所有的接口.
  
  PropertyInfo[] properties = inter.GetProperties();
  PropertyBuilder[] propertiesBuilder = new PropertyBuilder[properties.Length];
  for(int i=0; i < properties.Length; i++) {
  GeneratePropertyImplementation( typeBuilder, properties[i], ref propertiesBuilder[i] );
  }
  // 产生属性的实现.
  
  MethodInfo[] methods = inter.GetMethods();
  foreach(MethodInfo method in methods) {
  GenerateMethodImplementation( typeBuilder, method, propertiesBuilder, inter,
  handlerField, mixinsField, mixinPosition );
  }
  // 产生方法的实现.
  }
  
  // 属性的实现.
  private static void GeneratePropertyImplementation( TypeBuilder typeBuilder,
  PropertyInfo property, ref PropertyBuilder propertyBuilder ) {
  propertyBuilder = typeBuilder.DefineProperty(
  property.Name, property.Attributes, property.PropertyType, null);
  // 通过调用DefindProperty方法来产生属性的实现部分.
  }
  
  // 方法的实现.
  private static void GenerateMethodImplementation( TypeBuilder typeBuilder,
  MethodInfo method, PropertyBuilder[] properties,  Type inter,
  FieldBuilder handlerField, FieldBuilder mixinsField, int mixinPosition ) {
  ParameterInfo[] parameterInfo = method.GetParameters();
  // 取得参数信息.
  
  System.Type[] parameters = new System.Type[parameterInfo.Length];
  for (int i=0; i  parameters[i] = parameterInfo[i].ParameterType;
  }
  // 取得参数的类型.
  
  MethodAttributes atts = MethodAttributes.Public|MethodAttributes.Virtual;
  if ( method.Name.StartsWith("set_") || method.Name.StartsWith("get_") ) {
  atts = MethodAttributes.Public|MethodAttributes.SpecialName|MethodAttributes.Virtual;
  }
  // 指定方法的修饰.
  
  MethodBuilder methodBuilder = typeBuilder.DefineMethod( method.Name, atts,
  CallingConventions.Standard, method.ReturnType, parameters );
  // 定义方法.
  
  if ( method.Name.StartsWith("set_") || method.Name.StartsWith("get_") ) {
  foreach( PropertyBuilder property in properties ) {
  if (property == null) {
  break;
  }
  
  if (!property.Name.Equals( method.Name.Substring(4) )) {
  continue;
  }
中国IT教育热线咨询
相关文章
使用AJAX技术构建更优秀的Web应用程序
ASP应用程序设计的Web状态管理分析
Ajax驱动的Web站点
如何使用Ajax开发Web应用程序
XMLHttpRequest和AJAX虎视Web应用开发
最新文章
·PHP正则表达式从url中取得域名
·php设计模式介绍之迭代器模式
·简单学习php遇到的主要问题
·asp根据表单自动生成sql语句的函
·雅虎选项卡特效
 文章评论

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
ASP.NET ASP PHP JSP
·extjs ComboBox联动下拉菜单示例08-01
·漫谈.Net开发关于命名空间和目录划分07-31
·在Silverlight应用程序中操作Cookie07-28
·带附加条件的NewID()用法(downmoon)07-28
·对自定义路由进行单元测试07-28
·javascript实现yield07-28
·在ASP.NET中使用Google Maps07-28
·Sql Server2005 实现Oracle10g的hash表分区功07-28
·asp.net get set用法07-26
·Asp.net 控件开发—数据回传07-26
·接口vs. 的实体类07-26
·php设计模式介绍之迭代器模式08-02
·简单学习php遇到的主要问题08-02
·asp根据表单自动生成sql语句的函数08-02
·教你优化你的ASP程序03-07
·asp去除HTML标记的三个实用函数03-07
·ASP添加验证码的解决方法03-07
·ASP通用文章分页函数:非记录集分页03-07
·ASP教程基础:十天学会ASP第三天03-07
·ASP教程基础:十天学会ASP第二天03-07
·ASP教程基础:十天学会ASP第一天03-07
·能够生成google xml地图的asp源码03-06
·Linux系统下让PHP提高性能的工具APC05-06
·一个完整、安全的PHP用户登录系统11-14
·Apache+PHP+MySQL建立数据库驱动的动态网站08-24
·用SSH与PHP相连接 确保数据传输的安全性08-23
·PHP5手动最简安装方法08-03
·PHP程序加速探索之服务器负载测试07-11
·完全讲解PHP+MySQL的分页显示示例分析05-30
·用Suhosin加强PHP脚本语言安全性05-26
·初学入门 PHP 和 MySQL05-17
·传奇的诞生 PHP三位创始人简介05-10
·大型系统上PHP令人不爽的九大原因05-10
·ASP.NET和PHP、JSP究竟学哪个?07-30
·JAVA (Jsp)利用Google的Translate开发API07-29
·由Servlet获得FacesContext及ManagedBeans07-24
·用JOTM向Servlet中添加事务07-18
·用servlet生成验证码07-16
·JSP/Servlet伪静态网页实现07-08
·JSP和Servlet的关系浅谈06-15
·妙用异步Servlet扩展AJAX应用程序06-11
·servlet生成验证码图片06-02
·java.servlet.Filter的应用05-30
·Java程序员必看--扩展鼠标右键菜单功能05-13
  培训中心
人才交流中心 技术交流中心
  ITLab技术交流平台: