AOP编程在目前来说好像是大家都比较喜欢的。ASP.NET MVC中的Filter就是使用AOP实现的配置器模式。AOP在编码中的应用主要有如下几个方面:

日志记录,跟踪,优化和监控

事务的处理

持久化

性能的优化

资源池,如数据库连接池的管理

系统统一的认证、权限管理等

应用系统的异常捕捉及处理

针对具体行业应用的横切行为

前面几种应用我相信大家都是比较熟悉的。在ASP.NET MVC中有Filter之类的,提供认证和权限管理。很多实现AOP的组件都是拿日志作为例子说明。我这里给大家说明一个具体业务的横切例子。

以之前的Orchard.Car模块为例,如果我们这个模块式产品中的一个模块,当应用到项目中时,可能需要一些改动,那么AOP就可以在很多时候解决我们的问题。

假设我们现在有一个方法是获取Car的列表,那么对应的代码如下:

对应的Service代码如下:

别忘了在Route.cs中添加路由代码。

运行,查看结果:

如果在产品发布后,项目A中使用该产品,需要为car添加一个字段,叫做缩略图,那么很现实的一个问题是,我们是不是为了项目A单独为car扩展一个字段?这时候适配器就很重要了,实现适配器的方式有很多,我们这里就说明下如何使用AOP来实现字段的扩展。

首先需要一个Aufofac的module类,代码如下:

我们只需要为CarInfoService类来添加一个拦截器,别的就没有必要了。这里你会看到有一个SimpleInterceptor类,它的作用就是用来对CarInfoService的方法进行拦截。

SimpleInterceptor的代码如下:

如果当前的方法名称是GetList那么我们就为它添加一个字段,代表缩略图。这里我随便写一个,你可以根据自己的实际需要去做相应的改变。

现实中,可能这个Interceptor是在一个扩展模块中,所以对应的需要一个扩展的服务来提供Thumb字段。

结果不正确,因为我们客户端或者页面已经对运来的JSON进行了解析,所以新的JSON格式不是我们需要的,再次修改Interceptor的代码:

除了GetList方法可以通过AOP实现修改封闭扩展开放,你叶可以使用这种方式来扩展新增记录的方法。这时你需要把Request.Form从Controller中传入Service方法。这种扩展方式一个很大的好处就是可以帮助多个项目平稳的升级。产品模块的代码永远都不会被项目牵制。

具体的例子请到github上下载相应的代码来查看,这里就不做解释了。

上面只是我自己的一个小小的使用经验,有时候当字段的类型需要更改,而你不允许直接更改当前的代码时,这种方式也是一个不错的方法。

AOP虽然不是标准的设计模式之一,但是通过它可以让很多的模式更加简单的实现。

最后说明一下,OrchardNoCMS中如何实现的AOP。

它使用的Castle.DynamicProxy来实现的。结合Autofac。首先是对AutoFac的扩展类:

注入时,需要为注入的Component调用EnableDynamicProxy方法,代码位置:

可以看出来,所有实现继承了IDependency的类都可以使用AOP。

以上就是OrchardNoCMS的AOP编程示例,可以到https://github.com/nicholaspei/OrchardNoCMS 下载完整代码。

最新文章

  1. iOS runtime 知识点整理
  2. String和StringBuffer的转换
  3. pylab模式
  4. java中使用 正则 抓取邮箱
  5. Python核心编程-细节
  6. Question about pairing/bonding?
  7. Thread Pool Engine, and Work-Stealing scheduling algorithm
  8. Spring中BeanPostProcessor
  9. Flex布局新旧混合写法详解(兼容微信)
  10. 飘逸的python - 有的升序有的降序的情况下怎么多条件排序
  11. C# 调用C++ 结构体示例
  12. poj 1696 极角排序求最长逆时针螺旋线
  13. jetty服务器原理与maven集成
  14. 状压DP总结
  15. Ubuntu 远程挂载windows的分区
  16. spring in action 学习笔记八:用@Primary 或者@Qualifier消除@Autowired引起的歧义现象
  17. Javascript与Objective-C 字符串与数组的方法类比
  18. (转)Inno Setup入门(六)——在程序目录下创建文件夹
  19. autocomplete 属性 清除input框输入存留历史值,防止下拉历史值显示
  20. HDU1165: Eddy's research II(递推)

热门文章

  1. C#复习①
  2. 1.5 基础知识——GP2.3 提供资源(Resources) 与 GP2.4 分配职责(Responisbility)
  3. EMLS项目推进思考
  4. JavaScript Patterns 6.6 Mix-ins
  5. HttpModule
  6. 利用PHPMailer 来完成PHP的邮件发送 #转载自:大菜鸟在云端#
  7. Linux[Fedora]查找文件包含的字段
  8. android-The method findViewById(int) is undefined for the type ContactMainFragment报错
  9. /proc/interrupts 统计2.6.38.8与3.10.25差异
  10. java 正则表达式的应用:读取文件,获取其中的电话号码