经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
面向切面编程(AOP)
来源:cnblogs  作者:从未太晚  时间:2018/10/8 9:09:41  对本文有异议

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

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

  1. /// <summary>
  2. /// 装饰器模式实现静态代理
  3. /// AOP 在方法前后增加自定义的方法
  4. /// </summary>
  5. public class DecoratorAOP
  6. {
  7. public static void Show()
  8. {
  9. User user = new User()
  10. {
  11. Name = "Eleven",
  12. Password = "123123123123"
  13. };
  14. //直接调用
  15. IUserProcessor processor = new UserProcessor();
  16. processor.RegUser(user);
  17. Console.WriteLine("***************");
  18. //通过装饰器模式,在方法执行前后添加功能
  19. processor = new UserProcessorDecorator(processor);
  20. processor.RegUser(user);
  21. }
  22. public interface IUserProcessor
  23. {
  24. void RegUser(User user);
  25. }
  26. public class UserProcessor : IUserProcessor
  27. {
  28. public void RegUser(User user)
  29. {
  30. Console.WriteLine("用户已注册。Name:{0},PassWord:{1}", user.Name, user.Password);
  31. }
  32. }
  33. /// <summary>
  34. /// 装饰器的模式去提供一个AOP功能
  35. /// </summary>
  36. public class UserProcessorDecorator : IUserProcessor
  37. {
  38. private IUserProcessor _UserProcessor { get; set; }
  39. public UserProcessorDecorator(IUserProcessor userprocessor)
  40. {
  41. this._UserProcessor = userprocessor;
  42. }
  43. public void RegUser(User user)
  44. {
  45. BeforeProceed(user);
  46. this._UserProcessor.RegUser(user);
  47. AfterProceed(user);
  48. }
  49. /// <summary>
  50. /// 业务逻辑之前
  51. /// </summary>
  52. /// <param name="user"></param>
  53. private void BeforeProceed(User user)
  54. {
  55. Console.WriteLine("方法执行前");
  56. }
  57. /// <summary>
  58. /// 业务逻辑之后
  59. /// </summary>
  60. /// <param name="user"></param>
  61. private void AfterProceed(User user)
  62. {
  63. Console.WriteLine("方法执行后");
  64. }
  65. }
  66. }

 

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

  1. /// <summary>
  2. /// 代理模式实现静态代理
  3. /// AOP 在方法前后增加自定义的方法
  4. /// </summary>
  5. public class ProxyAOP
  6. {
  7. public static void Show()
  8. {
  9. User user = new User()
  10. {
  11. Name = "Eleven",
  12. Password = "123123123123"
  13. };
  14. IUserProcessor processor = new UserProcessor();
  15. //直接调用方法
  16. processor.RegUser(user);
  17. Console.WriteLine("***************");
  18. //实现AOP,在执行前后加其他方法
  19. processor = new ProxyUserProcessor();
  20. processor.RegUser(user);
  21. }
  22. public interface IUserProcessor
  23. {
  24. void RegUser(User user);
  25. }
  26. public class UserProcessor : IUserProcessor
  27. {
  28. public void RegUser(User user)
  29. {
  30. Console.WriteLine("用户已注册。Name:{0},PassWord:{1}", user.Name, user.Password);
  31. }
  32. }
  33. /// <summary>
  34. /// 代理模式去提供一个AOP功能
  35. /// </summary>
  36. public class ProxyUserProcessor : IUserProcessor
  37. {
  38. private IUserProcessor _UserProcessor = new UserProcessor();
  39. public void RegUser(User user)
  40. {
  41. BeforeProceed(user);
  42. this._UserProcessor.RegUser(user);
  43. AfterProceed(user);
  44. }
  45. /// <summary>
  46. /// 业务逻辑之前
  47. /// </summary>
  48. /// <param name="user"></param>
  49. private void BeforeProceed(User user)
  50. {
  51. Console.WriteLine("方法执行前");
  52. }
  53. /// <summary>
  54. /// 业务逻辑之后
  55. /// </summary>
  56. /// <param name="user"></param>
  57. private void AfterProceed(User user)
  58. {
  59. Console.WriteLine("方法执行后");
  60. }
  61. }
  62. }

 

 

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

  1. public class LogBeforeBehavior : IInterceptionBehavior
  2. {
  3. public IEnumerable<Type> GetRequiredInterfaces()
  4. {
  5. return Type.EmptyTypes;
  6. }
  7. public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
  8. {
  9. Console.WriteLine("LogBeforeBehavior");
  10. Console.WriteLine(input.MethodBase.Name);
  11. foreach (var item in input.Inputs)
  12. {
  13. Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(item));
  14. //反射&序列化获取更多信息
  15. }
  16. return getNext().Invoke(input, getNext);//
  17. }
  18. public bool WillExecute
  19. {
  20. get { return true; }
  21. }
  22. }

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

  1. public class UnityConfigAOP
  2. {
  3. public static void Show()
  4. {
  5. User user = new User()
  6. {
  7. Name = "Eleven",
  8. Password = "12345678934534643"
  9. };
  10. //这个是代码块,好神奇的呦
  11. {
  12. //配置UnityContainer
  13. IUnityContainer container = new UnityContainer();
  14. ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
  15. fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");
  16. Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
  17. UnityConfigurationSection configSection = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
  18. configSection.Configure(container, "aopContainer");
  19. IUserProcessor processor = container.Resolve<IUserProcessor>();
  20. processor.RegUser(user);
  21. }
  22. }
  23. }

 

 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号