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 ...
随机推荐
- 关于arcengine中geoprocessor使用的困惑
最近在实验一个小功能,就是用arcengine10.1做一个小程序,将point类型的shp转换为polyline类型的shp文件,用到的工具是pointstoline,但就是在设置input_fea ...
- 【图像处理】【SEED-VPM】1.注意点
1. 新装系统要启动NFX 每次虚拟机复位要执行以下命令 /usr/sbin/exportfs -av /sbin/service nfs restart —————————————————————— ...
- -bash: msgunfmt: command not found
执行命令:msgunfmt frontend.mo -o frontend.po 解决方法: 安装gettext完成后如下:
- 主流 SQLServer 迁移到 MySQL 工具对比
首次需要数据转换是测试环节,当时为了快速验证新研发云产品性能与结果准确性(算法类),所以需大量的原始数据,最快的办法就是使用老产品的真实数据.因为在前期数据转换时主用于内部验证,并没有花很多心思去处理 ...
- 《JavaScript高级程序设计》读书笔记--(3)引用类型
ECMAScript从技术来说是一门面向对象的语言,但不具备传统的面向对象语言所支持的类和接口等基本结构.虽然引用类型与类看起来类似,但是他们并不是相同的概念.引用类型有时也被成为对象定义,因为它描述 ...
- Spring(3)
一.Spring容器 Spring 提供了两种类型的IOC容器(后面还会讲到AOP容器): (1)BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spring的本身 ( ...
- map的四种遍历方式
map是Java中非常常用的一种数据结构,但map不同于set和list都继承自Collection接口. 所以map没有实现Collection的Iterator 方法,自身没有迭代器来遍历元素. ...
- 从新 开始学习java
今天备受打击了,群里 发一个段 招租的代码.挺火的,一时没想出来.就亲测了一遍.做了两遍才看出来原因,对此感觉基础不扎实,从新学习,当做复习. 群里传的代码 亲测,代码. 了解缘由. package ...
- Ext JS 4 新特性2:配置项属性(config)之一
Ext JS 4 新特征2:配置项属性config 最新版本的Ext JS 4.2的另外一个伟大的新特征就是增加了configuration配置项属性,当我们在创建一个新类的时候,经常性的要设置某某属 ...
- 记AppStore 被打回的经历
在快驰已然有半年时间之久. 见证了“快货运”产品,在不断摧残的环境中成长着. 两个人,将一个产品亲手从无到有的构建,有过心酸.有过累和有过憔悴,但当“快货运”开始上APP store时,又让人觉得开 ...