.Net 动态代理,AOP
.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的更多相关文章
- 浅析DispatchProxy动态代理AOP
浅析DispatchProxy动态代理AOP(代码源码) 最近学习了一段时间Java,了解到Java实现动态代理AOP主要分为两种方式JDK.CGLIB,我之前使用NET实现AOP切面编程,会用Fil ...
- 动态代理AOP实现方法过滤
上一节实现了动态代理,接下来 有时候,我不需要在每一个方法都要记录日志,做权限验证 等等. 所有就有了这样的需求.AOP实现特定方法过滤,有选择性的来对方法实现AOP 拦截.就是本节标题所示. 举个例 ...
- 动态代理 aop切面实现事务管理
1.定义接口和实现 public interface UserService { public String getName(int id); public Integer getAge(int id ...
- Spring-Boot的动态代理AOP原理
前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等. Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方 ...
- 5.动态代理AOP实现-DynamicProxy模式
通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...
- spring中使用动态代理(AOP)
spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; ...
- [编织消息框架][JAVA核心技术]cglib动态代理
先在mavne项目里添加cglib库 maven仓库搜索cglib版本 maven地址:http://mvnrepository.com/ 点击最新的版本 3.2.5 复制到pom.xml depe ...
- java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?
我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码. 代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,. ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- String Aop 动态代理例子
动态代理原理:spring AOP采用动态代理来实现 (1)定义一个接口Boy package aop001; public interface Boy { public void beat(Stri ...
随机推荐
- 【暑假】[深入动态规划]UVa 1627 Team them up!
UVa 1627 Team them up! 题目: Team them up! Time Limit: 3000MS Memory Limit: Unknown 64bit IO Forma ...
- HW6.28
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- URL- 含义及组成
URL (uniform resource locator) : 互联网的每个网页都有自己唯一的统一资源定位器,由3部分组成:通信协议,主机名,资源名. HTTP(hypertext transfer ...
- UI进阶 数据请求
一.HTTP和HTTPS协议 URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源,也被称为网址,因特网上标准的资源网址 ...
- 幻灯片(响应式设计)(jquery实现)
Html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- ISE和Modelsim联合仿真(转)
相信很多人会遇到过这个问题,不知如何让ISE调用Modelsim进行仿真.我也迷糊了不少时间,查查找找,终于弄明白了,所以有了本文,和大家分享一下.我尽量讲得详细点儿,多多上图. 我的环境:Windo ...
- python3使用PyMysql连接mysql数据库
python语言的3 x完全不向前兼容,导致我们在python2 x中可以正常使用的库,到了python3就用不了了 比如说mysqldb目前MySQLdb并不支持python3 python语言的3 ...
- C++学习笔记(五):指针和引用
声明指针: //指针声明 * 号左右的空格是可选的,下面的定义都是正确的 int *pointer1; int* pointer2; int*pointer3; int * pointer4; //注 ...
- Java foreach操作(遍历)数组
语法: 我们分别使用 for 和 foreach 语句来遍历数组 运行结果: 练习: import java.util.Arrays; public class HelloWorld { public ...
- XMPP——Smack[5]文件传输及离线消息的获取
三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线 ...