.Net 动态代理,AOP

直接上代码了。

/*****************************************
 * author:jinshuai
 *
 * E-mail:[email protected]
 *
 * Date:2016-04-28
 *
 * ***************************************/

using System;
using System.Collections.Generic;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;

namespace DynamicProxy.Core
{
    /// <summary>
    /// 代理工厂
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ProxyFactory<T>
    {
        public static T Create(T obj, Dictionary<string, DynamicAction> proxyMethods = null)
        {
            var proxy = new DynamicProxy<T>(obj) { ProxyMethods = proxyMethods };

            return (T)proxy.GetTransparentProxy();
        }
    }

    /// <summary>
    /// 动态代理类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class DynamicProxy<T> : RealProxy
    {
        private readonly T _targetInstance = default(T);

        public Dictionary<string, DynamicAction> ProxyMethods { get; set; }

        public DynamicProxy(T targetInstance)
            : base(typeof(T))
        {
            _targetInstance = targetInstance;
        }
        public override IMessage Invoke(IMessage msg)
        {
            var reqMsg = msg as IMethodCallMessage;

            if (reqMsg == null)
            {
                return new ReturnMessage(new Exception("调用失败!"), null);
            }

            var target = _targetInstance as MarshalByRefObject;

            if (target == null)
            {
                return new ReturnMessage(new Exception("调用失败!请把目标对象 继承自 System.MarshalByRefObject"), reqMsg);
            }

            var methodName = reqMsg.MethodName;

            DynamicAction actions = null;

            if (ProxyMethods != null && ProxyMethods.ContainsKey(methodName))
            {
                actions = ProxyMethods[methodName];
            }

            if (actions != null && actions.BeforeAction != null)
            {
                actions.BeforeAction();
            }

            var result = RemotingServices.ExecuteMessage(target, reqMsg);

            if (actions != null && actions.AfterAction != null)
            {
                actions.AfterAction();
            }

            return result;
        }
    }

    /// <summary>
    /// 动态代理要执行的方法
    /// </summary>
    public class DynamicAction
    {
        /// <summary>
        /// 执行目标方法前执行
        /// </summary>
        public Action BeforeAction { get; set; }

        /// <summary>
        /// 执行目标方法后执行
        /// </summary>
        public Action AfterAction { get; set; }

    }

}

DEMO:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DynamicProxy.Core;

namespace DynamicProxy.Demo
{
    class Program
    {
        static void Main(string[] args)
        {

            var proxyMotheds = new Dictionary<string, DynamicAction>();

            // key is  Proxy‘s methodName, value is Actions
            proxyMotheds.Add("Add", new DynamicAction()
            {
                BeforeAction = new Action(() => Console.WriteLine("Before Doing....")),
                AfterAction = new Action(() => Console.WriteLine("After Doing...."))
            });

            var user = new User();
            //proxy for User
            var t = ProxyFactory<User>.Create(user, proxyMotheds);

            int count = 0;

            t.Add("Tom", 28, out count);

            t.SayName();

            Console.WriteLine(count);
            Console.Read();

        }
    }
}

也可以到我的Github上,直接获取完整项目   https://github.com/jinshuai/DynamicProxy.NET

时间: 2024-08-27 18:57:38

.Net 动态代理,AOP的相关文章

动态代理AOP实现方法过滤

上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例子,对于查询的方法我不需要记录日志,所以,我就找到如果以"Get"开头的方法,就不记录日志,否则就记录日志:所以基于这样一个需求,代码如下: public override IMessage Invoke(IMessage msg) {   var methodCall = msg as

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

JDK,cglib动态代理-AOP学习

8.利用动态代理模式重构hibernate 动态代理模式: 1.产生的代理对象和目标对象实现了共同的接口 jdk动态代理 2.代理对象是目标对象的子类 hibernate: Person person = session.load(Person.class,1L);  javassisit spring:cglib动态代理 jdk的动态代理: 1.因为是用jdk的API做到的 2.代理对象是动态产生的 cglib产生的代理类是目标类的子类 注意事项: 1.拦截器中invoke方法体的内容就是代理

spring中使用动态代理(AOP)

spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; public void run() { System.out.println("我的汽车跑起来了" + color); } } 测试 public class SpringProxy { public static void main(String[] args) { //将代理类的cl

静态代理$动态代理

什么是静态代理? 静态代理就是代理模式,给真实类做了个增强的方法 比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉... 就要用到增强方法,就在代理类中给你的方法增强 //静态代理模式public class Progects {/* @Test public void dd() {//真实代理 Subject jk=new Real(); //代理对象 Proxy hj=new Proxy(); //调度代理对象(jk)方法增强 hj.setSub

JDK及CGLIB动态代理-AOP4种增强

动态代理 AOP底层实现:有接口自动应用的就是JDK动态代理(1).JDK 在运行时运行时注入本质:在内存中构建出接口的实现类特点:被代理对象,必须有接口 实例: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args)

动态代理实现aop

动态代理实现aop: 1.确定代理对象如接口 2.编写动态代理类,构造器初始化并传入代理对象 3.获得代理对象方法 1).指定代理对象由哪个加载器负责加载 2).指定代理类型 3)当调用代理对象调用其中方法时,该执行哪个方法, 在InvocationHandler h =new InvocationHandler()中 当调用proxy属性或相关方法时,如proxy.toString()会无限循坏,导致内存溢出. 4).3)输出顺序为日志,执行方法.日志,个人感觉用反射的地方蛮多的,没有spri

【转载】Java JDK 动态代理(AOP)使用及实现原理分析

转自:http://blog.csdn.net/jiankunking/article/details/52143504 版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图: 简单结构示意图: 为了保持

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

动态代理与AOP

1. 代理的分类: 静态代理:每个代理类只能为一个接口服务 动态代理:可以通过一个代理类完成全部的代理功能(由JVM生成实现一系列接口的代理类,即:生成实现接口的类的代理) 2. 动态代理: 在Java中要想实现动态代理机制,需要 java.lang.reflect.InvocationHandler 接口和 java.lang.reflect.Proxy 类的支持 java.lang.reflect.InvocationHandler 接口的定义如下: public interface Inv