.Net 动态代理,AOP

直接上代码了。

/*****************************************
* author:jinshuai
*
* E-mail:redfox2008@126.com
*
* 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 = ; t.Add("Tom", , out count); t.SayName(); Console.WriteLine(count);
Console.Read(); }
}
}

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

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

  1. 浅析DispatchProxy动态代理AOP

    浅析DispatchProxy动态代理AOP(代码源码) 最近学习了一段时间Java,了解到Java实现动态代理AOP主要分为两种方式JDK.CGLIB,我之前使用NET实现AOP切面编程,会用Fil ...

  2. 动态代理AOP实现方法过滤

    上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例 ...

  3. 动态代理 aop切面实现事务管理

    1.定义接口和实现 public interface UserService { public String getName(int id); public Integer getAge(int id ...

  4. Spring-Boot的动态代理AOP原理

    前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等. Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方 ...

  5. 5.动态代理AOP实现-DynamicProxy模式

    通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...

  6. spring中使用动态代理(AOP)

    spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; ...

  7. [编织消息框架][JAVA核心技术]cglib动态代理

    先在mavne项目里添加cglib库 maven仓库搜索cglib版本 maven地址:http://mvnrepository.com/ 点击最新的版本 3.2.5 复制到pom.xml  depe ...

  8. java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?

    我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码. 代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,. ...

  9. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  10. String Aop 动态代理例子

    动态代理原理:spring AOP采用动态代理来实现 (1)定义一个接口Boy package aop001; public interface Boy { public void beat(Stri ...

随机推荐

  1. PHP基本语法的小结

    一.PHP能做什么? PHP能做什么?我觉得它很强大,只要我能想到的,它都能做,只是我技术能力还不行╮(╯﹏╰)╭.好吧,一张图,基本了解一下吧(ps:PHP的功能不局限于此( ^_^ )) 图像有点 ...

  2. i++ 和 ++i 效率的分析

    我们通常在写for循环 的时候,要实现变量 i 的自增 1 :往往会在i++ 和++i中随便挑一种写,对于i++和++i的理解,我们往往停留在返回的值的不同,其实i++与++i在实现效率上也有一定的不 ...

  3. about云资源汇总指引V1.4:包括hadoop,openstack,nosql,虚拟化

    hadoop资料 云端云计算2G基础课程 (Hadoop简介.安装与范例) 炼数成金3G视频分享下载 虚拟机三种网络模式该如何上网指导此为视频 Hadoop传智播客七天hadoop(3800元)视频, ...

  4. 【bzoj2440】完全平方数

    题意: 求第n个不为完全平方数倍数的数 题解: 网上有人说答案不会超过2n (求证0 0?) 竟然不超过2n 那么很明显就是用二分做了 二分判定就是要求小于等于n的合法的数的个数 不难发现一个数若为完 ...

  5. SQL2008R2日志传送需要注意点

    当SQL2008R2采用日志传送方式进行备份/还原时需要注意事项 主从数据库机器必须是局域网内可互相通过共享访问的主机 主从数据库须添加系统帐号,并将sqlagent服务的启动帐号设定为此帐号,最好主 ...

  6. 笔记-iOS弹幕(源码)实现原理解析

    最近,读完今年的第三本书<大话移动APP测试 Android与iOS>,在读到陈晔前辈改变中国测试行业的决心时,内心无比激动,作为一名初生的开发人员,我可能还无法理解测试行业的本质,但他那 ...

  7. URL- 含义及组成

    URL (uniform resource locator) : 互联网的每个网页都有自己唯一的统一资源定位器,由3部分组成:通信协议,主机名,资源名. HTTP(hypertext transfer ...

  8. 高性能javascript

    高性能javascript开发 标签(空格分隔): javascript DOM访问与修改 访问DOM元素是具有代价的,修改元素代价较为昂贵,会导致浏览器重新计算页面的几何变化. 尽量减少DOM访问, ...

  9. CocoaPods容易出现的问题;

    一.初次安装cocoapods打开项目遇:Pods-resources.sh: Permission denied报错. 此类报错是指编译器在打开Pods-resources.sh文件的时候遭遇权限问 ...

  10. http://oncenote.com/2015/09/16/Security-2-HTTPS2/ (轉載)

    上一篇<iOS安全系列之一:HTTPS>被CocoaChina转载,还顺便上了下头条: 打造安全的App!iOS安全系列之 HTTPS,但那篇文章只是介绍了比较偏应用的初级知识,对于想要深 ...