RealProxy深入
Program.cs
class Program { static void Main(string[] args) { NoMethodLogging(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); SimpleMethodLogging(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); MethodLoggingWithProxies(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); ObjectLoggingWithProxiesFilteredOut(); Console.WriteLine("Press any key to continue..."); Console.ReadLine(); ObjectLoggingWithProxiesFilteredIn(); Console.ReadLine(); } private static void NoMethodLogging() { Console.WriteLine("Start - No method logging..."); IRepository<Order> orderRepository = new Repository<Order>(); Order order = , CustomerId = , Number = " }; orderRepository.Add(order); orderRepository.Update(order); orderRepository.Delete(order); Console.WriteLine("End - No method logging..."); } private static void SimpleMethodLogging() { //用SimpleMethodLoggingRepository,把Repository包装一下后,使用。 Console.WriteLine("Start - Simple method logging..."); IRepository<Order> orderRepository = new SimpleMethodLoggingRepository<Order>(new Repository<Order>()); Order order = , CustomerId = , Number = " }; orderRepository.Add(order); orderRepository.Update(order); orderRepository.Delete(order); Console.WriteLine("End - Simple method logging..."); } private static void MethodLoggingWithProxies() { Console.WriteLine("Start - RealProxy method logging..."); IRepository<Order> orderRepository = RealProxyMethodLoggingFactory.Create<Order>(); Order order = , CustomerId = , Number = " }; orderRepository.Add(order); orderRepository.Update(order); orderRepository.Delete(order); Console.WriteLine("End - RealProxy method logging..."); } private static void ObjectLoggingWithProxiesFilteredOut() { Console.WriteLine("Start - RealProxy object logging..."); IRepository<NotOrder> orderRepository = RealProxyObjectLoggingFactory.Create<NotOrder>(); NotOrder order = , CustomerId = , Number = " }; orderRepository.Add(order); orderRepository.Update(order); orderRepository.Delete(order); Console.WriteLine("End - RealProxy object logging..."); } private static void ObjectLoggingWithProxiesFilteredIn() { Console.WriteLine("Start - RealProxy object logging..."); IRepository<Order> orderRepository = RealProxyObjectLoggingFactory.Create<Order>(); Order order = , CustomerId = , Number = " }; orderRepository.Add(order); order.Number += "-Changed"; orderRepository.Update(order); orderRepository.Delete(order); Console.WriteLine("End - RealProxy object logging..."); } }
Entities.(NotOrder.cs/Order.cs)
public class NotOrder { public int CustomerId { get; set; } public int Id { get; set; } public string Number { get; set; } } public class Order { public int CustomerId { get; set; } public int Id { get; set; } public string Number { get; set; } }
Interfaces.IRepository.cs
internal interface IRepository<T> { void Add(T entity); void Delete(T entity); void Update(T entity); }
Implementations.Repository.cs
public class Repository<T> : IRepository<T> { public void Add(T entity) { Console.WriteLine("Adding {0}", entity); } public void Delete(T entity) { Console.WriteLine("Deleting {0}", entity); } public void Update(T entity) { Console.WriteLine("Updating {0}", entity); } }
Proxies.MethodProxy.cs
internal class MethodProxy<T> : RealProxy { private readonly T decorated; public MethodProxy(T decorated) : base(typeof(T)) { this.decorated = decorated; } public override IMessage Invoke(IMessage msg) { var methodCall = msg as IMethodCallMessage; OnBeforeExecute(methodCall); try { var methodInfo = methodCall.MethodBase as MethodInfo; var result = methodInfo.Invoke(decorated, methodCall.InArgs); OnAfterExecute(methodCall); , null, methodCall); } catch(Exception ex) { OnErrorExecute(methodCall); return new ReturnMessage(ex, methodCall); } } public event EventHandler<IMethodCallMessage> AfterExecute; public event EventHandler<IMethodCallMessage> BeforeExecute; public event EventHandler<IMethodCallMessage> ErrorExecute; private void OnAfterExecute(IMethodCallMessage methodCall) { if(AfterExecute!=null) { AfterExecute(this, methodCall); } } private void OnBeforeExecute(IMethodCallMessage methodCall) { if (BeforeExecute != null) { BeforeExecute(this, methodCall); } } private void OnErrorExecute(IMethodCallMessage methodCall) { if (ErrorExecute != null) { ErrorExecute(this, methodCall); } } }
Proxies.ObjectProxy.cs
internal class ObjectProxy<T> : RealProxy { private readonly T decorated; private Func<object[], bool> filter; public ObjectProxy(T decorated) : base(typeof(T)) { this.decorated = decorated; filter = x => true; } public Func<object[], bool> Filter { get { return filter; } set { if (value == null) filter = x => true; else filter = value; } } public override IMessage Invoke(IMessage msg) { var methodCall = msg as IMethodCallMessage; if (filter(methodCall.InArgs)) OnBeforeExecute(methodCall); try { var methodInfo = methodCall.MethodBase as MethodInfo; var result = methodInfo.Invoke(decorated, methodCall.InArgs); if (filter(methodCall.InArgs)) OnAfterExecute(methodCall); , null, methodCall); } catch (Exception ex) { if (filter(methodCall.InArgs)) OnErrorExecute(methodCall); return new ReturnMessage(ex, methodCall); } } public event EventHandler<IMethodCallMessage> AfterExecute; public event EventHandler<IMethodCallMessage> BeforeExecute; public event EventHandler<IMethodCallMessage> ErrorExecute; private void OnAfterExecute(IMethodCallMessage methodCall) { if (AfterExecute != null) { AfterExecute(this, methodCall); } } private void OnBeforeExecute(IMethodCallMessage methodCall) { if (BeforeExecute != null) { BeforeExecute(this, methodCall); } } private void OnErrorExecute(IMethodCallMessage methodCall) { if (ErrorExecute != null) { ErrorExecute(this, methodCall); } } }
最简单的日志添加方法,装饰者模式!
Implementations.SimpleMethodLoggingRepository.cs
internal class SimpleMethodLoggingRepository<T> : IRepository<T> { private readonly IRepository<T> decorated; public SimpleMethodLoggingRepository(IRepository<T> decorated) { this.decorated = decorated; } public void Add(T entity) { Log("Simple decorator - Before Adding {0}", entity); this.decorated.Add(entity); Log("Simple decorator - After Adding {0}", entity); } public void Delete(T entity) { Log("Simple decorator - Before Deleting {0}", entity); this.decorated.Delete(entity); Log("Simple decorator - After Deleting {0}", entity); } public void Update(T entity) { Log("Simple decorator - Before Updating {0}", entity); this.decorated.Add(entity); Log("Simple decorator - After Updating {0}", entity); } private void Log(string message,object arg) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message, arg); Console.ResetColor(); } }
使用RealProxy实现日志添加!
Implementations.RealProxyMethodLoggingFactory.cs
internal class RealProxyMethodLoggingFactory { public static IRepository<T> Create<T>() { var methodProxy = new MethodProxy<IRepository<T>>(new Repository<T>()); methodProxy.BeforeExecute += MethodProxy_BeforeExecute; methodProxy.AfterExecute += MethodProxy_AfterExecute; methodProxy.ErrorExecute += MethodProxy_ErrorExecute; return methodProxy.GetTransparentProxy() as IRepository<T>; } private static void Log(string message,object arg) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message, arg); Console.ResetColor(); } private static void MethodProxy_ErrorExecute(object sender, IMethodCallMessage e) { Log("RealProxy - Error executing '{0}'", e.MethodName); } private static void MethodProxy_AfterExecute(object sender, IMethodCallMessage e) { Log("RealProxy - After executing '{0}'", e.MethodName); } private static void MethodProxy_BeforeExecute(object sender, IMethodCallMessage e) { Log("RealProxy - Before executing '{0}'", e.MethodName); } }
使用RealProxy实现日志添加,并添加过滤!
Implementations.RealProxyObjectLoggingFactory.cs
internal class RealProxyObjectLoggingFactory { public static IRepository<T> Create<T>() { var objectProxy = new ObjectProxy<IRepository<T>>(new Repository<T>()); objectProxy.BeforeExecute += objectProxy_BeforeExecute; objectProxy.AfterExecute += objectProxy_AfterExecute; objectProxy.ErrorExecute += objectProxy_ErrorExecute; objectProxy.Filter = x => { ) ] is Order; return false; }; return objectProxy.GetTransparentProxy() as IRepository<T>; } private static void Log(string message, object arg = null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message); Console.ResetColor(); } private static void objectProxy_AfterExecute(object sender, IMethodCallMessage e) { Log(] as Order), "Order"))); } private static void objectProxy_BeforeExecute(object sender, System.Runtime.Remoting.Messaging.IMethodCallMessage e) { Log(] as Order), "Order"))); } private static void objectProxy_ErrorExecute(object sender, IMethodCallMessage e) { Log(] as Order), "Order"))); } }
结果图:
1.NoMethodLogging();
2.SimpleMethodLogging();
3.MethodLoggingWithProxies();
4.ObjectLoggingWithProxiesFilteredOut();
5.ObjectLoggingWithProxiesFilteredIn(); (只截取了部分图片,引用了ObjectDumper.dll才出现这样的显示方式)
RealProxy深入的更多相关文章
- .Net中的RealProxy实现AOP
序言 这个AOP要从我们公司的一个事故说起,前段时间公司的系统突然在乌云中出现,数据被泄露的一览无余,乌云上显示是SQL注入攻击.呵,多么贴近生活的一个露洞,可谓是人尽皆知啊.然而却华丽丽的给拉我们一 ...
- RealProxy实现AOP编程(2)
稍微变化一下!注意区别. Program.cs class Program { static void Main(string[] args) { User user = " }; var ...
- RealProxy实现AOP编程(1)
Program.cs class Program { static void Main(string[] args) { User user = " }; var processor = T ...
- .Net基于RealProxy实现AOP
一.概述 关于AOP(面向切面编程)还是先讲一个日常经常碰到的场景"错误日志的记录",一般来说我们编码的时候想记录错误日志都是用try..catch来进行捕捉和记录,慢慢的你会发现 ...
- 真实代理(RealProxy)在WCF中的运用
在WCF中,当我们在调用服务端的方法时,一般有两点需要考虑:1.捕获服务端的异常信息,记录日志:2.及时关闭会话信道,当调用超时或调用失败时及时中断会话信道.我们一般会像下面这样处理(以Calcula ...
- .net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移
在学习.net core的过程中,我们已经明确被告知,Remoting将不会被支持.官方的解释是,.net framework 类型包含了太多的Runtime的内容,是一个非常重量级的服务实现,已被确 ...
- (二)远程代理Remoting/RealProxy
使用.Net Remoting/RealProxy 采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - Real ...
- RealProxy AOP的实现
微软有一篇实现 一下是对于该实现的理解 https://msdn.microsoft.com/zh-cn/library/dn574804.aspx public class DynamicProxy ...
- RealProxy AOP过滤方法的参数
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
随机推荐
- 【译】Android 6.0 Changes (机翻加轻微人工校对)
Android 6.0 Changes In this document Runtime Permissions Doze and App Standby Apache HTTP Client Rem ...
- mysql启动报错The server quit without updating PID file
现网mysql无法启动是很让人头疼的,数据很有可能恢复不了,解决方法如下: 查看mysql目录下的日志,根据日志来锁定错误原因(mysql的错误日志很抽象) a.如果日志不能提供任何帮助则可进行以下步 ...
- 关于css样式2
css文本 CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用 ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- git学习心得总结
最近学习git,应为git可以不需要服务器而在任意的Linux机器上管理代码,相对svn和cvs还是有它的优势的,所以我选用了git来管理我的小项目,以后在提供svn的管理. 在使用了一段时间后想写一 ...
- C# 判断文件有没占用
C# 判断文件有没占用 using System; using System.Collections.Generic; using System.Text; using System.Runtime. ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- iOS7下隐藏status bar的详细研究
info.plist文件中,View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于a ...
- MySQL数据库9 - 日期与时间函数
一 日期和时间函数 函数的概念:按指定格式输入参数,返回正确结果的运算单元 1. 返回当前日期:curdate() current_date() current_date()+0可以将当前日期转换为数 ...