zoukankan      html  css  js  c++  java
  • WebSharp Aspect改进(续2)

        接着上次在《朗志轻量级项目管理解决方案》中对Aspect的改进,
    注意,这里我们实现了IXmlSerialization接口,以实现自定义的反序列化操作,还应注意的是在反串行的过程中,这里我们使用了一个自已实现的深拷贝DeepCopy
    public class AspectCollection:CollectionBase,IXmlSerializable
        
    {
            
    public AspectCollection()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }

            
    public void Add(AspectItem ai)
            
    {
                
    this.InnerList.Add(ai);
            }

            
    public new AspectItem this[int index]
            
    {
                
    get
                
    {
                    
    return this.InnerList[index] as AspectItem;
                }

                
    set
                
    {
                    
    this.InnerList[index]=value;
                }


            }

            
    IXmlSerializable 成员
    这里我使用了.net内置的序列化功能
    using System;
    using System.Xml.Serialization;
    namespace Langzhi.Aspect
    {
        
    /// <summary>
        
    /// AspectItem 的摘要说明。
        
    /// </summary>

        [Serializable()]
        
    public class AspectItem
        
    {
            
    public AspectItem()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }

            
    private string m_Type;
            
    private string m_DeployModel;
            
    private string m_PointCutType;
            
    private string m_ActionPosition;
            
    private RuleCollection m_RuleCollection;
    //        private string m_ID;
            private string m_AssemblyName;
            
    private string m_ClassName;
            [XmlAttribute(
    "type")]
            
    public string Type
            
    {
                
    get
                
    {
                    
    return this.m_Type;
                }

                
    set
                
    {
                    
    this.m_Type=value;
                }

            }

            [XmlAttribute(
    "deploy-model")]
            
    public string DeployModel
            
    {
                
    get
                
    {
                    
    return this.m_DeployModel;
                }

                
    set
                
    {
                    
    this.m_DeployModel=value;
                }

            }

            [XmlAttribute(
    "pointcut-type")]
            
    public string PointCutType
            
    {
                
    get
                
    {
                    
    return this.m_PointCutType;
                }

                
    set
                
    {
                    
    this.m_PointCutType=value;
                }

            }

            [XmlAttribute(
    "action-position")]
            
    public string ActionPosition
            
    {
                
    get
                
    {
                    
    return this.m_ActionPosition;
                }

                
    set
                
    {
                    
    this.m_ActionPosition=value;
                }

            }

    //        [XmlAttribute("id")]
    //        public string ID
    //        {
    //            get
    //            {
    //                return this.m_ID;
    //            }
    //            set
    //            {
    //                this.m_ID = value;
    //            }
    //            
    //        }
            [NonSerialized()]
            
    public string ID;
            [NonSerialized()]
            
    public string AssemblyName;
            [NonSerialized()]
            
    public string ClassName;
            [NonSerialized()]
            
    public IAspect SingletonAspect;
            
    public RuleCollection Rules
            
    {
                
    get
                
    {
                    
    return this.m_RuleCollection;                
                }

                
    set
                
    {
                    
    this.m_RuleCollection=value;
                }

            }


        }

    }


        public class RuleCollection:CollectionBase//,IXmlSerializable//此处可以不用实现IXmlSerializable接口
        {
            
    static readonly log4net.ILog log=log4net.LogManager.GetLogger(typeof(RuleCollection));
            
    public RuleCollection()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }

            
    public void Add(RuleItem ari)
            
    {
                
    this.InnerList.Add(ari);
            }

            
    public RuleItem this[int index]
            
    {
                
    get
                
    {
                    
    return (RuleItem)this.List[index];
                }

                
    set
                
    {
                    
    this.InnerList[index]=value;
                }

            }

            
    IXmlSerializable 成员
            
    /// <summary>
            
    /// 
            
    /// </summary>
            
    /// <param name="type"></param>
            
    /// <returns></returns>

            public RuleCollection FindCollectionByType(string type)
            
    {
                type
    =type.Trim().ToLower();
                RuleCollection rc
    =new RuleCollection();
                
    foreach(RuleItem ri in this.InnerList)
                
    {
                    
    if (ri.type.ToLower()==type)
                    
    {
                        rc.Add(ri);
                    }

                }

                
    if (rc.Count!=0)
                
    {
                    
    return rc;
                }

                
    else
                
    {
                    
    return null;
                }

            }


            
    public bool IsMatch(IMethodMessage mmsg,AspectItem aspectInfo)
            
    {
    //            if (this.InnerList==null)
    //            {
    //                return false;
    //            }
                foreach (RuleItem ri in this.InnerList)
                
    {
                    
    //是否匹配类和方法
                    string[] match= ri.match.Split(',');
                    
    string classNamePattern= string.Format("^{0}$",match[0]);
                    
    string methodNamePattern = string.Format("^{0}$",match[1]);
    //                log.Debug(string.Format("classNamePattern:{0}", classNamePattern));
    //                log.Debug(string.Format("methodNamePattern:{0}", methodNamePattern));
    //                log.Debug(mmsg.MethodBase.ReflectedType.FullName);
    //                log.Debug(mmsg.MethodName);
    //                log.Debug(mmsg.Properties["__TypeName"].ToString().Split(',')[0].ToString());
    //                log.Debug(mmsg.Properties["__MethodName"].ToString());
    //                log.Debug(mmsg.MethodBase.ReflectedType.Name);
                    if (Regex.IsMatch(mmsg.MethodBase.ReflectedType.FullName,classNamePattern))
                    
    {
                        log.Debug(
    string.Format("匹配类:{0}", classNamePattern));
                        
    if (mmsg.MethodBase.IsConstructor && aspectInfo.PointCutType.IndexOf("Construction")>-1)
                        
    {
                            log.Debug(
    "construction");
                            log.Debug(mmsg.MethodName);
                            
    return true;
                        }

                        
    if ((aspectInfo.PointCutType.IndexOf("Method")>-1 || aspectInfo.PointCutType.IndexOf("Property")>-1&& Regex.IsMatch(mmsg.MethodName,methodNamePattern)==true)
                        
    {
                            log.Debug(
    "method or property");
                            log.Debug(mmsg.MethodName);
                            
    return true;
                        }

                    }

                }

                
    return false;
            }

            
    public static byte[] Serialize(RuleCollection rc)
            
    {
                BinaryFormatter bf
    =new BinaryFormatter();
                MemoryStream ms
    =new MemoryStream();
                
    byte[] b;
                bf.Serialize(ms, rc);
                ms.Position 
    = 0;
                b
    =new byte[ms.Length];
                ms.Read(b, 
    0, b.Length);
                ms.Close();
                
    return b;
            }

            
    public static RuleCollection Deserizlize(byte[] b)
            
    {
                
    if (b.Length==0)
                
    {
                    
    return null;
                }

    //            try
    //            {
                    BinaryFormatter bf=new BinaryFormatter();
                    MemoryStream ms
    =new MemoryStream();
                    ms.Write(b, 
    0, b.Length);
                    ms.Position 
    = 0;
                    RuleCollection rc 
    = (RuleCollection) bf.Deserialize(ms);
                    ms.Close();
                    
    return rc;
    //            }
    //            catch (System.Exception e)
    //            {
    //                
    //            }

            }

            
    public RuleCollection DeepCopy()
            
    {
                BinaryFormatter bf
    =new BinaryFormatter();
                MemoryStream ms
    =new MemoryStream();
                
    byte[] b;
                bf.Serialize(ms, 
    this);
                ms.Position 
    = 0;
                RuleCollection rc 
    = (RuleCollection) bf.Deserialize(ms);
                ms.Close();
                
    return rc;
            }

        }


    ______________________________
    朗志工作室:承接北京地区网站类项目
  • 相关阅读:
    数字图像处理学习笔记(1)---位图的读写、几何变换、傅里叶变换、直方图均衡
    【C++】队列的实现
    【C++】一个简单栈的实现
    【Eclipse】Eclipse常用快捷键
    【Android】串口通信
    【Android SDK Manager】Android SDK Manager更新速度慢的一种解决方法
    class-dump 安装使用详解
    ios 给微信开发一个插件并安装到未越狱的手机上教程
    新建的亚马逊云服务器EC2 ping 不通 解决方案
    ubuntu服务器上提示 To run a command as administrator (user "root"), use "sudo <command>". See " 解决方案
  • 原文地址:https://www.cnblogs.com/lexus/p/964833.html
Copyright © 2011-2022 走看看