欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

面向切面编程(AOP)

程序员文章站 2022-04-10 22:09:57
结合设计模式,通过代码理解面向切面编程,有代码的很好理解的,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);

            }
        }
    }