zoukankan      html  css  js  c++  java
  • Aspect Oriented Programming面向切面编程

    I简介

    Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是权限验证,日志记录。

    举个例子,我们现在提供例了获取数据的一个方法,但是我们希望并不是所有人都有权限调用。如果按照传统的OOP的实现的话,我们实现了获取数据获取数据,同时为了要进行权限验证的的话,那我们在实现该方法中要添加验证权限的代码。这样的话,假如我们要实现的功能有多个呢?那就要在每个实现的类都添加这些验证权限的代码。这样做的话就会有点繁琐,而且每个实现类都与验证权限的行为紧耦合,违反了面向对象的规则。那么怎样才能把验证权限的行为与业务处理过程中分离出来呢?看起来好像就是获取数据的方法自己在进行,但却是背后权限验证为这些行为进行验证,并且方法调用者都不知道存在这些权限验证过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。

    II代码实现:

    1.        类标签声明

     

        /// <summary>
    
        /// 支持权限验证标签
    
        /// </summary>
    
        [AttributeUsage(AttributeTargets.Class)]
    
        public class PermissionCheckAttribute :ContextAttribute
    
        {
    
     
    
            public PermissionCheckAttribute()
    
                : base("PermissionCheck")
    
            { }
    
            public override voidGetPropertiesForNewContext(IConstructionCallMessage ccm)
    
            {
    
                ccm.ContextProperties.Add(newPermissionCheckProperty());
    
            }
    
    }

     2.        验证属性声明   

     public class PermissionCheckProperty :IContextProperty,
    
           IContributeObjectSink
    
        {
    
            #region IContributeObjectSinkimplementation
    
            public IMessageSinkGetObjectSink(MarshalByRefObject o,
    
            IMessageSink next)
    
            {
    
                return new SecurityAspect(next);
    
            }
    
            #endregion // IContributeObjectSinkimplementation
    
     
    
            #region IContextProperty implementation
    
            // Implement Name, Freeze,IsNewContextOK
    
     
    
            public string Name
    
            {
    
                get { return"PermissionCheckProperty"; }
    
            }
    
            public void Freeze(Context newContext)
    
            {
    
            }
    
            public bool IsNewContextOK(ContextnewCtx)
    
            {
    
                return true;
    
            }
    
            #endregion //IContextPropertyimplementation
    
    }

    3.        验证属性上下文声明  

      public class PermissionCheckProperty :IContextProperty,
    
           IContributeObjectSink
    
        {
    
            #region IContributeObjectSinkimplementation
    
            public IMessageSinkGetObjectSink(MarshalByRefObject o,
    
            IMessageSink next)
    
            {
    
                return new SecurityAspect(next);
    
            }
    
            #endregion // IContributeObjectSinkimplementation
    
     
    
            #region IContextProperty implementation
    
            // Implement Name, Freeze,IsNewContextOK
    
     
    
            public string Name
    
            {
    
                get { return"PermissionCheckProperty"; }
    
            }
    
            public void Freeze(Context newContext)
    
            {
    
            }
    
            public bool IsNewContextOK(ContextnewCtx)
    
            {
    
                return true;
    
            }
    
            #endregion //IContextProperty implementation
    
        }

    4.        函数标签声明   

     /// <summary>
    
        /// 功能描述标签类
    
        /// </summary>
    
        [AttributeUsage(AttributeTargets.All,AllowMultiple = false, Inherited = true)]
    
        public class FeatureDescriptionAttribute :Attribute
    
        {
    
            /// <summary>
    
            /// 功能编号
    
            /// </summary>
    
            public string Guid { get; set; }
    
           /// <summary>
    
           /// 功能描述
    
           /// </summary>
    
            public string Description { get; set; }
    
     
    
            public FeatureDescriptionAttribute() {}
    
     
    
            public FeatureDescriptionAttribute(stringname, string description)
    
            {
    
                this.Guid = name;
    
                this.Description = description;
    
            }
    
    }

    5.验证实现具体帮助类

      

      /// <summary>
    
        /// 权限验证帮助类
    
        /// </summary>
    
        public class PowerHelper
    
        {
    
            /// <summary>
    
            /// 权限验证方法实现
    
            /// </summary>
    
            /// <param name="guid">功能编号</param>
    
            /// <paramname="description">功能描述</param>
    
            public static voidPermissionCheck(string guid, string description)
    
            {
    
     
    
                //TODO:此处查询数据库,做权限验证
    
                if (guid =="04C4DFC7-9EDD-4A5D-9029-3EDCD5977163")
    
                {
    
                    //拥有权限,正常   
    
                    MessageBox.Show("权限检测通过");
    
                }
    
                else
    
                {
    
                    //没有权限
    
                    throw newUnauthorizedAccessException("访问被拒绝,当前用户不具有操作此功能的权限!");
    
                }
    
            }
    
    }

    III具体使用例子

    1.        功能函数声明 

     [PermissionCheck]
    
        public class ControlDemoApi :ContextBoundObject
    
        {
    
            [FeatureDescription("04C4DFC7-9EDD-4A5D-9029-3EDCD5977163","功能1")]
    
            public void Function1()
    
            {
    
               
    
                MessageBox.Show("成功的执行了功能1!");
    
            }
    
     
    
           [FeatureDescription("2FCFA71B-D492-4F88-8A75-985AC70BA161","功能2")]
    
            public void Function2()
    
            {
    
              MessageBox.Show("成功的执行了功能2!");
    
            }
    
    }

    2.调用功能函数  

     ControlDemoApi apiDemo =new ControlDemoApi();
    
      apiDemo.Function1();
    
    apiDemo. Function2();

    3.说明

           如2中描述,在执行apiDemo. Function1();之前会自动调用验证实现具体帮助类中的PermissionCheck(string guid, string description)方法。执行结果为 首先弹出消息权限检测通过,然后弹出消息 成功的执行了功能1! 

    如2中描述,在执行apiDemo. Function2 ();之前会自动调用验证实现具体帮助类中的PermissionCheck(stringguid, string description)方法。执行结果为 访问被拒绝,抛出异常 当前用户不具有操作此功能的权限! 

  • 相关阅读:
    安装jdk1.8导致eclipse显示问题
    Linux创建定时任务
    Burp suite抓取HTTPS请求
    Webbench性能测试
    Fiddler抓取手机Https请求
    Linux下使用Jmeter做性能测试
    Charles抓取手机https请求
    Jmeter发送Java请求
    Linux搭建JDK、Tomcat安装及配置
    Loadrunner监控Apache
  • 原文地址:https://www.cnblogs.com/shanranlei/p/3630948.html
Copyright © 2011-2022 走看看