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深入的更多相关文章

  1. .Net中的RealProxy实现AOP

    序言 这个AOP要从我们公司的一个事故说起,前段时间公司的系统突然在乌云中出现,数据被泄露的一览无余,乌云上显示是SQL注入攻击.呵,多么贴近生活的一个露洞,可谓是人尽皆知啊.然而却华丽丽的给拉我们一 ...

  2. RealProxy实现AOP编程(2)

    稍微变化一下!注意区别. Program.cs class Program { static void Main(string[] args) { User user = " }; var ...

  3. RealProxy实现AOP编程(1)

    Program.cs class Program { static void Main(string[] args) { User user = " }; var processor = T ...

  4. .Net基于RealProxy实现AOP

    一.概述 关于AOP(面向切面编程)还是先讲一个日常经常碰到的场景"错误日志的记录",一般来说我们编码的时候想记录错误日志都是用try..catch来进行捕捉和记录,慢慢的你会发现 ...

  5. 真实代理(RealProxy)在WCF中的运用

    在WCF中,当我们在调用服务端的方法时,一般有两点需要考虑:1.捕获服务端的异常信息,记录日志:2.及时关闭会话信道,当调用超时或调用失败时及时中断会话信道.我们一般会像下面这样处理(以Calcula ...

  6. .net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移

    在学习.net core的过程中,我们已经明确被告知,Remoting将不会被支持.官方的解释是,.net framework 类型包含了太多的Runtime的内容,是一个非常重量级的服务实现,已被确 ...

  7. (二)远程代理Remoting/RealProxy

    使用.Net Remoting/RealProxy 采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - Real ...

  8. RealProxy AOP的实现

    微软有一篇实现 一下是对于该实现的理解 https://msdn.microsoft.com/zh-cn/library/dn574804.aspx public class DynamicProxy ...

  9. RealProxy AOP过滤方法的参数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

随机推荐

  1. 【译】Android 6.0 Changes (机翻加轻微人工校对)

    Android 6.0 Changes In this document Runtime Permissions Doze and App Standby Apache HTTP Client Rem ...

  2. mysql启动报错The server quit without updating PID file

    现网mysql无法启动是很让人头疼的,数据很有可能恢复不了,解决方法如下: 查看mysql目录下的日志,根据日志来锁定错误原因(mysql的错误日志很抽象) a.如果日志不能提供任何帮助则可进行以下步 ...

  3. 关于css样式2

    css文本 CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用 ...

  4. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  5. POJ 题目2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13519   Accepted: 787 ...

  6. git学习心得总结

    最近学习git,应为git可以不需要服务器而在任意的Linux机器上管理代码,相对svn和cvs还是有它的优势的,所以我选用了git来管理我的小项目,以后在提供svn的管理. 在使用了一段时间后想写一 ...

  7. C# 判断文件有没占用

    C# 判断文件有没占用 using System; using System.Collections.Generic; using System.Text; using System.Runtime. ...

  8. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  9. iOS7下隐藏status bar的详细研究

    info.plist文件中,View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于a ...

  10. MySQL数据库9 - 日期与时间函数

    一 日期和时间函数 函数的概念:按指定格式输入参数,返回正确结果的运算单元 1. 返回当前日期:curdate() current_date() current_date()+0可以将当前日期转换为数 ...