.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 ...
随机推荐
- NOIP2005 过河
过河 (river.pas/c/cpp) [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正 ...
- mysql 清空表的两种方法
一.Delete DELETE FROM `table`; 二.Truncate TRUNCATE `table`; 第一种方法其实就是去掉where条件,没有了条件,也就是删除掉表里面的所有记录了: ...
- 机器学习-----线性回归浅谈(Linear Regression)
Linear Regreesion 在现实生活中普遍存在着变量之间的关系,有确定的和非确定的.确定关系指的是变量之间可以使用函数关系式表示,还有一种是属于非确定的(相关),比如人的身 ...
- algorithm@ find the shortest path in a graph using BFS
Finding Shortest Paths By BFS
- 数据文件 和日志文件 收缩 Sql Server
A. 将数据文件收缩到指定的目标大小 以下示例将 UserDB 用户数据库中名为 DataFile1 的数据文件的大小收缩到 7 MB. 复制 USE UserDB; GO DBCC SHRINKFI ...
- Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)
Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...
- mac linux netstat -n
一直都不明白为什么mac就是不现实8080端口,现在明白了 USERtekiiMac-3:~ user$ netstat -an | grep tcp46 tcp46 0 0 *.8009 *.* L ...
- Cocos2d-x 重写draw方法绘制直线等图形时被遮挡覆盖问题的一种解决方案
最近在学习过程cocos2dx的过程中需要使用到绘制直线的功能,所以我就采用了引擎中 ccDrawLine 方法,然后重写 draw 方法,在该方法中绘制直线. 但是出现了一个问题,那就是绘制的图形被 ...
- android最快的模拟器
https://www.genymotion.com/ genymotion Genymotion是一套完整的工具,它提供了Android虚拟环境.它简直就是开发者.测试人员.推销者甚至是游戏玩家的福 ...
- CSS层叠样式选择器归纳
常用选择器 1.1 类型选择器:用来寻找特定类型的元素 标签 { 声明 } p { color:black; } h1 { font-weight:bold; } 1.2 后代选择器: 选择一个元 ...