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 ...
随机推荐
- String字符串类课后作业
String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...
- code of C/C++(2)
初学者学习构造函数和析构函数,面对如何构造的问题,会头大.这里提供了变量(int,double,string),char *,字符数组三个类型的私有成员初始化的方法 //char * 类型的成员,如何 ...
- Android中ListView的用法
使用方法1 显示简单的文本 在layout文件中像加入普通控件一样在layout文件中引入ListView <ListView android:id="@+id/list_view&q ...
- 设计模式(2)--单例模式(Singleton Pattern)
概述 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称):当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的 ...
- 《Pro Express.js》学习笔记——Express框架常用设置项
Express 设置 系统设置 1. 无须再定义,大部分有默认值,可不设置 2. 常用设置 env view cache view engine views trust pro ...
- low-rank 的相关求解方法 (CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization
(CODE) Low-Rank Matrix Recovery and Completion via Convex Optimization 这个是来自http://blog.sina.com.cn/ ...
- C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...
- aspjpeg 组件在asp中的使用
本来好的系统,你却没有做好迁移等交接工作,所以,要麻烦死自己了-------for 凌杰 首先,该系统为asp系统,需要aspjpeg 支持.... 经过使用和测试.发现有如下小结. 1. 安装时 ...
- C语言程序设计第四次作业
态度决定一切,我依然要说这句话,每次同学们提交的作业,我都会认真评阅,相比实验课而言,可以有更充足的时间来发现问题,很多同学的代码依然会存在一些语法错误或者考虑不周全的现象,我提出了,那么,你认真看了 ...
- Pyhon环境搭建-window
1.安装python3.4.3版本 地址:(64位)https://www.python.org/ftp/python/3.4.3/python-3.4.3.amd64.msi (32位)http:/ ...