• 利用消息机制实现.NET AOP(面向方面编程)--利用ServerContextSink实现多截获


    以下代码实现利用ServerContextSink来实现多截获

    //框架代码

    //ObjectWithAspect.cs
    using System;

    namespace DotNetAOP.ServerContextSink.Framework
    {
        [ObjectSinkChain]
        
    public abstract class ObjectWithAspects:ContextBoundObject
        
    {
        }

    }


    //ServerContextSinkChainProperty.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    namespace DotNetAOP.ServerContextSink.Framework
    {
        [Serializable]
        
    class ServerContextSinkChainProperty:
            IContextProperty,
            
    //IContributeObjectSink,  //如果不需捕获构造函数,则可使用ObjectSink
            IContributeServerContextSink //如果构造函数也要捕获,则使用ServerContextSink
        {
            
    string _name;
            Type _type;

            
    public ServerContextSinkChainProperty(Type type,string name)
            
    {
                _name 
    = name;
                _type 
    = type;
            }


            
    private AspectAttribute[] GetAspectAttributes(Type type)
            
    {
                
    return (AspectAttribute[])_type.GetCustomAttributes(typeof(AspectAttribute), true);
            }



            
    IContextProperty 成员


            
    IContributeObjectSink 成员

            
    IContributeServerContextSink 成员
        }

    }


    //ServerContextSinkChainAttribute.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    namespace DotNetAOP.ServerContextSink.Framework
    {
        [AttributeUsage(AttributeTargets.Class)]
        
    class ObjectSinkChainAttribute:ContextAttribute
        
    {
            
    public ObjectSinkChainAttribute()
                : 
    base("ServerContextSink_Framework_ObjectSinkChainAttribute")
            
    {
            }


            
    public override void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg)
            
    {
                Type type 
    = ctorMsg.ActivationType;
                ctorMsg.ContextProperties.Add(
    new ServerContextSinkChainProperty(type,this.AttributeName));
            }

            
    public override bool IsContextOK(Context ctx, IConstructionCallMessage ctorMsg)
            
    {
                
    return (ctx.GetProperty(this.AttributeName) != null );
            }

        }

    }


    //AsyncReplyHelperSink.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;


    namespace DotNetAOP.ServerContextSink.Framework
    {
        
    class AsyncReplyHelperSink : IMessageSink
        
    {
            
    public delegate IMessage AsyncReplyHelperSinkDelegate(IMessage msg);

            IMessageSink _nextSink 
    = null;
            AsyncReplyHelperSinkDelegate _delegate 
    = null;

            
    public AsyncReplyHelperSink(IMessageSink nextSink, AsyncReplyHelperSinkDelegate delegates)
            
    {
                _nextSink 
    = nextSink;
                _delegate 
    = delegates;
            }


            
    IMessageSink 成员
        }

    }

    //AspectAttribute.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    namespace DotNetAOP.ServerContextSink.Framework
    {
        
    public abstract class AspectAttribute:Attribute
        
    {
            
    public abstract IMessageSink CreateAspectSink(IMessageSink nextSink);
        }

    }


    //Demo代码

    //Program.cs
    using System;

    using DotNetAOP.ServerContextSink.Framework;

    namespace DotNetAOP.ServerContextSink.Demo
    {
        
    /// <summary>
        
    /// Class1 的摘要说明。
        
    /// </summary>

        class Program
        
    {
            
    /// <summary>
            
    /// 应用程序的主入口点。
            
    /// </summary>

            [STAThread]
            
    static void Main(string[] args)
            
    {
                Calculator calc 
    = new Calculator();
                Console.WriteLine(calc.Add(
    1,2));
                Console.WriteLine(calc.Divide(
    2,0));
    //            Test2 t2 = new Test2();
    //            t2.Te();
                Console.ReadLine();
            }

        }

    }


    //LogSinkAttribute.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    using DotNetAOP.ServerContextSink.Framework;

    namespace DotNetAOP.ServerContextSink.Demo
    {
        [AttributeUsage(AttributeTargets.Class)]
        
    public class LogSinkAttribute:AspectAttribute
        
    {
            
    public override IMessageSink CreateAspectSink(IMessageSink nextSink)
            
    {
                
    return new LogSink(nextSink);
            }


        }

    }


    //LogSink.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    using DotNetAOP.ServerContextSink.Framework;

    namespace DotNetAOP.ServerContextSink.Demo
    {
        
    public class LogSink:IMessageSink
        
    {
            
    readonly IMessageSink _nextSink;
            
    public LogSink(IMessageSink nextSink)
            
    {
                _nextSink 
    = nextSink;
            }

            
    IMessageSink 成员

            
    private IMessage AsyncProcessMessage(IMessage msg)
            
    {
                IMethodCallMessage call 
    = msg as IMethodCallMessage;
                IConstructionCallMessage ctr 
    = call as IConstructionCallMessage;
                
    if (ctr != null)
                
    {
                    Console.WriteLine(
    "构造函数:\t" + ctr.MethodName);
                }

                
    else
                
    {
                    Console.WriteLine(
    "普通方法:\t" + call.MethodName);
                }

                
    return msg;

            }

        }

    }


    //Log2Sink.cs
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Activation;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    using System.Runtime.Remoting.Services;

    using DotNetAOP.ServerContextSink.Framework;

    namespace DotNetAOP.ServerContextSink.Demo
    {
        
    public class Log2Sink : IMessageSink
        
    {
            
    readonly IMessageSink _nextSink;
            
    public Log2Sink(IMessageSink nextSink)
            
    {
                _nextSink 
    = nextSink;
            }

            
    IMessageSink 成员

            
    private IMessage AsyncProcessMessage(IMessage msg)
            
    {
                IMethodCallMessage call 
    = msg as IMethodCallMessage;
                IConstructionCallMessage ctr 
    = call as IConstructionCallMessage;
                
    if (ctr != null)
                
    {
                    Console.WriteLine(
    "构造函数:\t" + ctr.MethodName);
                }

                
    else
                
    {
                    Console.WriteLine(
    "普通方法:\t" + call.MethodName);
                }

                
    return msg;

            }

        }



        [AttributeUsage(AttributeTargets.Class)]
        
    public class Log2SinkAttribute : AspectAttribute
        
    {
            
    public override IMessageSink CreateAspectSink(IMessageSink nextSink)
            
    {
                
    return new Log2Sink(nextSink);
            }


        }

    }


    //Calculator.cs
    using System;

    using DotNetAOP.ServerContextSink.Framework;

    namespace DotNetAOP.ServerContextSink.Demo
    {
        [LogSink,Log2Sink]
        
    public class Calculator:ObjectWithAspects
        
    {
            
    public Calculator()
            
    {
            }

            
    public double Add(double a , double b)
            
    {
                
    return a + b;
            }

            
    public double Divide(double a, double b)
            
    {
                
    return a/b;
            }

        }

    }

    需要上面完整代码请留下Email。

    查看其它框架实现请转到此页

    利用消息机制实现.NET AOP(面向方面编程)--通过RealProxy实现
    利用消息机制实现.NET AOP(面向方面编程)--利用RealProxy和消息接收器实现多截获
    利用消息机制实现.NET AOP(面向方面编程)--利用ServerContextSink实现多截获

  • 相关阅读:
    不用+做加法
    实用类型转换
    Failed to retrieve application JMX service URL
    0.辗转相除法
    1. 数组与字符串
    Java数据结构之257二叉树的所有路径
    Java数据结构与算法之DFS
    Java数据结构与算法之图
    Java数据结构与算法之快速排序、归并排序
    Java数据结构与算法之冒泡排序、选择排序
  • 原文地址:https://www.cnblogs.com/think/p/460382.html
Copyright © 2020-2023  润新知