.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. 【OpenGL】入门

    根据OpenGL蓝宝书(OpenGL超级宝典)来入门,写的比较细,易懂,这里给我贴代码和记录零碎的事儿用 第一个代码 #include <gl/glut.h> void RenderSce ...

  2. 流(stream)

    流的概念 Java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过Java的输入/输出系统与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输入/输 ...

  3. A Tour of Go Exercise: Images

    Remember the picture generator you wrote earlier? Let's write another one, but this time it will ret ...

  4. Go: using a pointer to array

    下面的不是指针指向数组,而是指针指向Slice I'm having a little play with google's Go language, and I've run into someth ...

  5. VB操作Excel

    在工程中添加引用:Microsoft Office 9.0 Object Library                    Microsoft Excel 9.0 Object Library   ...

  6. php中带mb的字符串处理函数

    int strlen ( string $string ) int mb_strlen ( string $str [, string $encoding ] ) encoding参数为字符编码.如果 ...

  7. Runtime 10种用法

    来源:haojingxue_iOS 链接:http://www.jianshu.com/p/3182646001d1 阅读了多篇运行时的文章,感觉都很不错,从几篇文章里面提取一些个人认为比较重要的,偏 ...

  8. postfix 不记录日志的问题解决方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. iOS 强制横屏

    // // AAAAViewController.m // hengp // // Created by 朱信磊 on 15/2/13. // Copyright (c) 2015年 niit. Al ...

  10. Android下pm命令详解

    在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之. 0. Usage: ...