当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 面向切面编程(AOP)

面向切面编程(AOP)

2018年10月07日  | 移动技术网IT编程  | 我要评论
结合设计模式,通过代码理解面向切面编程,有代码的很好理解的,5分钟可以看三遍 通过,结构型设计模式,装饰器模式来实现AOP,代码如下 通过,结构型设计模式,代理模式来实现AOP,代码如下 通过Unity实现AOP,配置太复杂就不贴了。。。就一个实现类的代码,可以用于添加方法的日志,异常处理,不用修改 ...

结合设计模式,通过代码理解面向切面编程,有代码的很好理解的,5分钟可以看三遍

通过,结构型设计模式,装饰器模式来实现aop,代码如下

 /// <summary>
    /// 装饰器模式实现静态代理
    /// aop 在方法前后增加自定义的方法
    /// </summary>
    public class decoratoraop
    {
        public static void show()
        {
            user user = new user()
            {
                name = "eleven",
                password = "123123123123"
            };
            //直接调用
            iuserprocessor processor = new userprocessor();
            processor.reguser(user);
            console.writeline("***************");
            //通过装饰器模式,在方法执行前后添加功能
            processor = new userprocessordecorator(processor);
            processor.reguser(user);
        }

        public interface iuserprocessor
        {
            void reguser(user user);
        }
        public class userprocessor : iuserprocessor
        {
            public void reguser(user user)
            {
                console.writeline("用户已注册。name:{0},password:{1}", user.name, user.password);
            }
        }

        /// <summary>
        /// 装饰器的模式去提供一个aop功能
        /// </summary>
        public class userprocessordecorator : iuserprocessor
        {
            private iuserprocessor _userprocessor { get; set; }
            public userprocessordecorator(iuserprocessor userprocessor)
            {
                this._userprocessor = userprocessor;
            }

            public void reguser(user user)
            {
                beforeproceed(user);

                this._userprocessor.reguser(user);

                afterproceed(user);
            }

            /// <summary>
            /// 业务逻辑之前
            /// </summary>
            /// <param name="user"></param>
            private void beforeproceed(user user)
            {
                console.writeline("方法执行前");
            }
            /// <summary>
            /// 业务逻辑之后
            /// </summary>
            /// <param name="user"></param>
            private void afterproceed(user user)
            {
                console.writeline("方法执行后");
            }
        }

    }

 

通过,结构型设计模式,代理模式来实现aop,代码如下

   /// <summary>
    /// 代理模式实现静态代理
    /// aop 在方法前后增加自定义的方法
    /// </summary>
    public class proxyaop
    {
        public static void show()
        {
            user user = new user()
            {
                name = "eleven",
                password = "123123123123"
            };
            iuserprocessor processor = new userprocessor();
            //直接调用方法
            processor.reguser(user);
            console.writeline("***************");
            //实现aop,在执行前后加其他方法
            processor = new proxyuserprocessor();
            processor.reguser(user);
        }

        public interface iuserprocessor
        {
            void reguser(user user);
        }
        public class userprocessor : iuserprocessor
        {
            public void reguser(user user)
            {
                console.writeline("用户已注册。name:{0},password:{1}", user.name, user.password);
            }
        }

        /// <summary>
        /// 代理模式去提供一个aop功能
        /// </summary>
        public class proxyuserprocessor : iuserprocessor
        {
            private iuserprocessor _userprocessor = new userprocessor();

            public void reguser(user user)
            {
                beforeproceed(user);
                this._userprocessor.reguser(user);
                afterproceed(user);
            }

            /// <summary>
            /// 业务逻辑之前
            /// </summary>
            /// <param name="user"></param>
            private void beforeproceed(user user)
            {
                console.writeline("方法执行前");
            }
            /// <summary>
            /// 业务逻辑之后
            /// </summary>
            /// <param name="user"></param>
            private void afterproceed(user user)
            {
                console.writeline("方法执行后");
            }
        }

    }

 

 

通过unity实现aop,配置太复杂就不贴了。。。就一个实现类的代码,可以用于添加方法的日志,异常处理,不用修改方法本身,不用挨个方法+log.info()了,通过unity(ioc)创建的对象都能用,代码如下

 public class logbeforebehavior : iinterceptionbehavior
    {
        public ienumerable<type> getrequiredinterfaces()
        {
            return type.emptytypes;
        }
        public imethodreturn invoke(imethodinvocation input, getnextinterceptionbehaviordelegate getnext)
        {
            console.writeline("logbeforebehavior");
            console.writeline(input.methodbase.name);
            foreach (var item in input.inputs)
            {
                console.writeline(newtonsoft.json.jsonconvert.serializeobject(item));
                //反射&序列化获取更多信息
            }
            return getnext().invoke(input, getnext);//
        }

        public bool willexecute
        {
            get { return true; }
        }
    }

 再加一个unity创建对象和调用的代码吧,nuget添加unity的引用

public class unityconfigaop
    {
        public static void show()
        {
            user user = new user()
            {
                name = "eleven",
                password = "12345678934534643"
            };
             //这个是代码块,好神奇的呦
            {
                //配置unitycontainer
                iunitycontainer container = new unitycontainer();
                execonfigurationfilemap filemap = new execonfigurationfilemap();
                filemap.execonfigfilename = path.combine(appdomain.currentdomain.basedirectory + "cfgfiles\\unity.config");
                configuration configuration = configurationmanager.openmappedexeconfiguration(filemap, configurationuserlevel.none);
                unityconfigurationsection configsection = (unityconfigurationsection)configuration.getsection(unityconfigurationsection.sectionname);
                configsection.configure(container, "aopcontainer");

                iuserprocessor processor = container.resolve<iuserprocessor>();
                processor.reguser(user);

            }
        }
    }    

 

 

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网