AOP面向切面编程

OOP(面向对象编程):万物皆对象,通过对象之间的相互组合,组成一系列功能,再将一系列功能组合成模块,最后组成系统。每个类就像一个细胞一样,通过组合的方式最终成为人,即系统。
OOP的优点在于设计灵活、可扩展、可重用,缺点在于面向对象都是静态的,需求上的细微变动将会对系统引起较大的影响,无法解决类内部的变化。

AOP(面向切面编程):是对OOP的补充,专门用来解决类内部的变化问题。能动态修改静态OOP模型,即在不破坏封装的类的前提下,为类增加一些公共逻辑,而非业务逻辑。例如:(1)异常检测;(2)添加缓存;(3)参数检查;(4)添加日志

AOP的实现:1.静态实现AOP;2.动态实现AOP。
1.通过装饰器模式实现静态AOP,AOP能在方法前后增加自定义方法。

    public class DecoratorAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Li Ming",
                Password = "24524354dfs"
            };
            IUserProcessor processor = new UserProcessor();
            processor.RegisterUser(user);
            Console.WriteLine("——————————————————————");

            processor = new UserProcessorDecorator(processor);
            processor.RegisterUser(user);
        }

        public interface IUserProcessor
        {
            void RegisterUser(User user);
        }
        public class UserProcessor : IUserProcessor
        {
            public void RegisterUser(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 RegisterUser(User user)
            {
                BeforeProceed(user);
                this._UserProcessor.RegisterUser(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("方法执行后自己的逻辑");
            }
        }

    }

2.通过代理模式实现静态AOP,AOP能在方法前后增加自定义方法。

    public class ProxyAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Li Ming",
                Password = "24524354dfs"
            };
            IUserProcessor processor = new UserProcessor();
            processor.RegisterUser(user);
            Console.WriteLine("——————————————————————");

            processor = new ProxyUserProcessor();
            processor.RegisterUser(user);
        }

        public interface IUserProcessor
        {
            void RegisterUser(User user);
        }
        public class UserProcessor : IUserProcessor
        {
            public void RegisterUser(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 RegisterUser(User user)
            {
                BeforeProceed(user);
                this._UserProcessor.RegisterUser(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("方法执行后自己的逻辑");
            }
        }

    }

3.通过.Net Remoting/RealProxy 实现动态AOP,该方法的缺陷在于业务类必须是继承自MarshalByRefObject类型

    public class RealProxyAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Li Ming",
                Password = "24524354dfs"
            };

            UserProcessor processor = new UserProcessor();
            processor.RegisterUser(user);

            Console.WriteLine("——————————————————————");
            UserProcessor userProcessor = TransparentProxy.Create<UserProcessor>();
            userProcessor.RegisterUser(user);
        }

        /// <summary>
        /// 真实代理
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class MyRealProxy<T> : RealProxy
        {
            private T tTarget;
            public MyRealProxy(T target)
                : base(typeof(T))
            {
                this.tTarget = target;
            }

            public override IMessage Invoke(IMessage msg)
            {
                BeforeProceede(msg);
                
                IMethodCallMessage callMessage = (IMethodCallMessage)msg;
                object returnValue = callMessage.MethodBase.Invoke(this.tTarget, callMessage.Args);

                AfterProceede(msg);

                return new ReturnMessage(returnValue, new object[0], 0, null, callMessage);
            }
            
            /// <summary>
            /// 业务逻辑之前自己的逻辑
            /// </summary>
            /// <param name="msg"></param>            
            public void BeforeProceede(IMessage msg)
            {
                Console.WriteLine("方法执行前自己的逻辑");
            }
            
             /// <summary>
            /// 业务逻辑之后自己的逻辑
            /// </summary>
            /// <param name="msg"></param>
            public void AfterProceede(IMessage msg)
            {
                Console.WriteLine("方法执行后自己的逻辑");
            }
        }

        /// <summary>
        /// 透明代理
        /// </summary>
        public static class TransparentProxy
        {
            public static T Create<T>()
            {
                T instance = Activator.CreateInstance<T>();
                MyRealProxy<T> realProxy = new MyRealProxy<T>(instance);
                T transparentProxy = (T)realProxy.GetTransparentProxy();
                return transparentProxy;
            }
        }


        public interface IUserProcessor
        {
            void RegisterUser(User user);
        }

        /// <summary>
        /// 必须继承自MarshalByRefObject父类,否则无法生成
        /// </summary>
        public class UserProcessor : MarshalByRefObject, IUserProcessor
        {
            public void RegisterUser(User user)
            {
                Console.WriteLine("注册:用户名称为{0} Password为{1}", user.Name, user.Password);
            }
        }

    }

4.通过Castle\DynamicProxy 实现动态AOP,缺点在于方法必须为虚方法

    public class CastleProxyAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Li Ming",
                Password = "24524354dfs"
            };
            ProxyGenerator generator = new ProxyGenerator();
            MyInterceptor interceptor = new MyInterceptor();
            UserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor);
            userprocessor.RegisterUser(user);
        }
        public interface IUserProcessor
        {
            void RegisterUser(User user);
        }

        public class UserProcessor : IUserProcessor
        {
            /// <summary>
            /// 必须带上virtual 否则无效~
            /// </summary>
            /// <param name="user"></param>
            public virtual void RegisterUser(User user)
            {
                Console.WriteLine("注册:Name为{0},PassWord为{1}", user.Name, user.Password);
            }
        }

        public class MyInterceptor : IInterceptor
        {
            public void Intercept(IInvocation invocation)
            {
                PreProceed(invocation);
                invocation.Proceed();
                PostProceed(invocation);
            }
            /// <summary>
            /// 业务逻辑之前自己的逻辑
            /// </summary>
            /// <param name="invocation"></param>
            public void PreProceed(IInvocation invocation)
            {
                Console.WriteLine("方法执行前自己的逻辑");
            }
            /// <summary>
            /// 业务逻辑之后自己的逻辑
            /// </summary>
            /// <param name="invocation"></param>
            public void PostProceed(IInvocation invocation)
            {
                Console.WriteLine("方法执行后自己的逻辑");
            }
        }
    }

5.使用EntLib\PIAB Unity 实现动态AOP。此方法为通常使用的方法,引用里添加Unity.Interception和Unity,Unity.Interception为Unity的扩展。
在这里插入图片描述

    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; }
        }
    }
    
        public class LogAfterBehavior : IInterceptionBehavior
    {
        public IEnumerable<Type> GetRequiredInterfaces()
        {
            return Type.EmptyTypes;
        }

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
        {
            IMethodReturn methodReturn = getNext()(input, getNext);//在自己逻辑执行后添加日志记录

            Console.WriteLine("LogAfterBehavior");
            Console.WriteLine(input.MethodBase.Name);
            foreach (var item in input.Inputs)
            {
                Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(item));
            }
            Console.WriteLine("LogAfterBehavior" + methodReturn.ReturnValue);
            return methodReturn;
        }

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

    public class UnityAOP
    {
        public static void Show()
        {
            User user = new User()
            {
                Name = "Li Ming",
                Password = "24524354dfs"
            };
            {
                //配置UnityContainer
                IUnityContainer container = new UnityContainer();
                ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
                //获取配置文件
                fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Config\\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>();
                var user1 = processor.GetUser(user);
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值