C# AOP微型框架实现(二)

 
3. AopProxyAttribute  AOP代理特性

/****************************** AopProxyAttribute   ************************************

using System;
using System.Runtime.Remoting ;
using System.Runtime.Remoting.Proxies ;

namespace EnterpriseServerBase.Aop
{
 /// <summary>
 /// AopProxyAttribute
 /// AOP代理特性,如果一个类想实现具体的AOP,只要实现AopProxyBase和IAopProxyFactory,然后加上该特性即可。
 /// 2005.04.11
 /// </summary>
 
 [AttributeUsage(AttributeTargets.Class ,AllowMultiple = false)]
 public class AopProxyAttribute : ProxyAttribute
 {
  private IAopProxyFactory proxyFactory = null ;

  public AopProxyAttribute(Type factoryType)
  {
   this.proxyFactory = (IAopProxyFactory)Activator.CreateInstance(factoryType) ;   
  }

  #region CreateInstance
  /// <summary>
  /// 获得目标对象的自定义透明代理
  /// </summary>
  public override MarshalByRefObject CreateInstance(Type serverType)//serverType是被AopProxyAttribute修饰的类
  {
   //未初始化的实例的默认透明代理
   MarshalByRefObject target =  base.CreateInstance (serverType); //得到位初始化的实例(ctor未执行)
   object[] args = {target ,serverType} ;
   //AopProxyBase rp = (AopProxyBase)Activator.CreateInstance(this.realProxyType ,args) ; //Activator.CreateInstance在调用ctor时通过了代理,所以此处将会失败
   
   //得到自定义的真实代理
   AopProxyBase rp = this.proxyFactory.CreateAopProxyInstance(target ,serverType) ;//new AopControlProxy(target ,serverType) ;
   return (MarshalByRefObject)rp.GetTransparentProxy() ;
  }
  #endregion
 }
}

4 .MethodAopSwitcherAttribute.cs

/**************************** MethodAopSwitcherAttribute.cs *************************

using System;

namespace EnterpriseServerBase.Aop
{
 /// <summary>
 /// MethodAopSwitcherAttribute 用于决定一个被AopProxyAttribute修饰的class的某个特定方法是否启用截获 。
 /// 创建原因:绝大多数时候我们只希望对某个类的一部分Method而不是所有Method使用截获。
 /// 使用方法:如果一个方法没有使用MethodAopSwitcherAttribute特性或使用MethodAopSwitcherAttribute(false)修饰,
 ///       都不会对其进行截获。只对使用了MethodAopSwitcherAttribute(true)启用截获。
 /// 2005.05.11
 /// </summary>
 [AttributeUsage(AttributeTargets.Method ,AllowMultiple = false )]
 public class MethodAopSwitcherAttribute : Attribute
 {
  private bool useAspect = false ;

  public MethodAopSwitcherAttribute(bool useAop)
  {   
   this.useAspect = useAop ;
  }

  public bool UseAspect
  {
   get
   {
    return this.useAspect ;
   }
  }
 }
}

时间: 2024-10-27 07:14:03

C# AOP微型框架实现(二)的相关文章

C# AOP微型框架实现(一)

  在前面的系列文章中,我介绍了消息.代理与AOP的关系,这次将我自己实现的一个AOP微型框架拿出来和大家交流一下. AOP的最基本功能就是实现特定的预处理和后处理,我通过代理实现了此微型框架. 先来看看构成此微型框架的4个.cs文件. 1.CommonDef.cs 用于定义最基本的AOP接口 /************************************* CommonDef.cs ************************** using System;using Syst

通向架构师的道路(第二十天)万能框架spring(二)maven结合spring与ibatis

一.前言 上次讲了Struts结合Spring并使用Spring的JdbcTemplate来搭建工程框架后我们面临着jar库无法管理,工程发布不方便,jar包在工程内太占空间,jar包冲突,管理,甚至漏包都问题.于是我们在讲"万能框架spring(二)"前,传授了一篇番外篇,即讲利用maven来管理我们的jar库. 从今天开始我们将结合"万能框架spring(一)"与番外篇maven来更进一步丰富我们的ssx框架,那么今天讲的是使用iBatis3结合SS来构建我们的

CUDA并行计算框架(二) 实例相关

从这部分开始 结合虫子的demo程序给大家分析下cuda的性能与可行性. 一.先概述下实现流程. CUDA在执行的时候是让host里面的一个一个的kernel按照线程网格(Grid)的概念在显卡硬件(GPU)上执行.每一个线程网格又可以包含多个线程块(block),每一个线程块中又可以包含多个线程(thread). 每一个kernel交给每一个Grid来完成.当要执行这些任务的时候,每一个Grid又把任务分成一部分一部分的block,block再分线程来完成.每个Grid中的任务是一定的.二维线

通向架构师的道路 第二十天 万能框架spring(二)maven结合spring与ibatis

一.前言 上次讲了Struts结合Spring并使用Spring的JdbcTemplate来搭建工程框架后我们面临着jar库无法管理,工 程发布不方便,jar包在工程内太占空间,jar包冲突,管理,甚至漏包都问题.于是我们在讲"万能框架spring(二)"前,传授 了一篇番外篇,即讲利用maven来管理我们的jar库. 从今天开始我们将结合"万能框架spring(一)"与番外篇maven来更 进一步丰富我们的ssx框架,那么今天讲的是使用iBatis3结合SS来构建

搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (二)创建你的项目

本篇文章的目的:首先是创建解决方案.并创建相关的项目.先介绍一下项目的各自的作用: 从数据库层到表示层依次为: 数据库层:        1.接口IDao层:IDao        2.Dao层实现:HibernateDao和SqlDao             HibernateDao:由Hibernate实现的IDao部分             SqlDao:是由我们自己写sql实现的部分 业务逻辑层:        1.业务逻辑接口层:IBLL        2.业务逻辑接口的实现:BL

Emit学习-实战篇-实现一个简单的AOP框架(二)

已经9点了,就不废话了,直接开讲,今天就简单的介绍下框架中用到的一些接口和属性.昨天把我们关注的切面分成了三类,现在给出这3个接口的定义: 接口定义 /// <summary> /// 在调用方法体前执行的处理接口 /// </summary> public interface IPreProcess { bool PreProcess(MethodContext methodContext); } /// <summary> /// 在调用方法体后执行的处理接口 //

ASP.NET MVC5网站开发项目框架(二)_实用技巧

前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依葫芦画瓢开写. 一.基本框架 还是先说下基本框架吧,一下子搞了7个项目看着挺乱的,我的理解是M.V.C 3者中,M是数据载体,V是用户要看的试图,C主要是协调控制与用户界面相关的操作,而数据的处理,数据库的的操作交给DAL.BLL来做.整个思路就是:View是用户看到的界面:Control

Play框架(二) 响应

我上一章总结了Play框架的基本使用.这一章里,我将修改和增加响应. HTTP协议是按照"请求-响应"的方式工作.Play框架的核心是用动作(Action)来完成"请求-响应".一个动作负责处理一种请求.一个项目可能要定义许多动作.复杂的网站,可能要定义上百个动作.所以,Play使用控制器(Controller)和URL路由(URL routing)来组织管理动作.控制器用于给动作分类.URL路由(routes)记录了URL和动作的对应关系. IDE 在开发代码之前

基于OSGi实现分布式服务框架历程(二)

在这篇历程中来完成对于JINI的Spike,目标仍然是判断基于JINI实现服务的路由.查找需求的满足度. JINI是由Sun研究院制定的,其目标就是为了实现分布式的服务,所以在很多地方可以看到它和分布式服务框架是有不少重叠之处的,来先看看它对于需求的满足度,最后再来分析做个总结. 1.怎么实现远程的将服务注册到服务中心? 在jini中暂时没有找到远程注册服务到服务中心的方法. jini的服务需要和服务中心部署在同一台机器上,这个倒是可以通过服务管理中心直接将sar格式的服务部署上去,支持服务的动