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 下载完整代码。

基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--AOP编程的更多相关文章

  1. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...

  2. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--瘦身计划

    Orchard CMS是针对CMS开发的,对于很多开发需求来说,内容管理这块儿可能并不需要,而需要它的模块式开发模式.所以我这里通过对OrchardCMS进行瘦身,去除 内容管理部分的内容,保留简单的 ...

  3. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发

    之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了大家的评论,有以下几个问题: 1.希望有更多的文档说明. 2.希望介绍下Orchard的 ...

  4. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--BootStrap

    按照几个月之前的计划,也应该写一个使用Bootstrap作为OrchardNoCMS的UI库.之前这段时间都是在学习IOS开发,没顾得上写,也没顾得上维护OrchardNoCMS代码.看看我的活动轨迹 ...

  5. 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

    1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...

  6. 转发-基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现

    基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现   概述 在日常开发中, 我们经常谈起模块化/插件化架构,这样可既可以提高开效率,又可以实现良好的扩展性,尤其对于产品化的系统有 ...

  7. 基于ASP.NET MVC的快速开发平台,给你的开发一个加速度!

    基于ASP.NET MVC的快速开发平台,给你的开发一个加速度! bingo炸了 2017/4/6 11:07:21 阅读(37) 评论(0) 现在的人做事情都讲究效率,最好能达到事半功倍那种效果,软 ...

  8. GPS部标平台的架构设计(十)-基于Asp.NET MVC构建GPS部标平台

    在当前很多的GPS平台当中,有很多是基于asp.NET+siverlight开发的遗留项目,代码混乱而又难以维护,各种耦合和关联,要命的是界面也没见到比Javascript做的控件有多好看,随着需求的 ...

  9. ASP.NET MVC中商品模块小样

    在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...

随机推荐

  1. MVC中使用SignaIR入门教程

    一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ...

  2. mysql 判断表字段或索引是否存在

    判断字段是否存在: DROP PROCEDURE IF EXISTS schema_change; DELIMITER // CREATE PROCEDURE schema_change() BEGI ...

  3. 7、软件质量工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件质量工程师在项目组中的作用不是那么明显,但是它是软件质量的重要度量标准人员.有句话说:软件质量是生产出来的,不是开发出来的.通过软件质量审查,能够对软件项目的代码等质量进行衡量,最起码要能够对代码 ...

  4. c#操作IIS站点

    /// <summary> /// 获取本地IIS版本 /// </summary> /// <returns></returns> public st ...

  5. Linux基本操作命令之文件查看cat more less tail head

    cat 参考之前博客:Linux基础命令之cat使用方法大全 more 命令 命令:more使用权限:所有使用者使用方式:more [选项] filename说明:类似于cat,不过会一页一页的显示内 ...

  6. 关于 RTL8723BS 同时开启 STA/AP 模式

    最近接到一个调试 wifi 驱动的任务,使用的是 rtl8723bs 芯片组.要求是让无线设备工作在 station 模式的时候同时开启一个 ap 热点.简单来讲就是连接其他 wifi 的同时发出一个 ...

  7. vim IDE平台-打造属于自己的配置

    vim IDE平台-打造属于自己的配置 一.前言 目前工作环境基本以Linux为主,自然用到VIM也很多,很早就对如何提高VIM的使用效率有所研究,限于时间关系,也没做个系统记录和资料积累,时间久了又 ...

  8. PHP读取超大文件的实例代码

    数据量大带来的问题就是单个文件很大,能够打开这个文件相当不容易,记事本就不要指望了,果断死机   去年年底的各种网站帐号信息的数据库泄漏,很是给力啊,趁机也下载了几个数据库,准备学学数据分析家来分析一 ...

  9. 创建Windows Azure内部负载均衡器

    与普通的负载均衡器一样,Windows Azure内部负载均衡器也是四层的.内部负载均衡器会被分配一个内网地址,只能从虚拟网络内部访问,包括VPN和ExpressRoute. 内部负载均衡器通常被用于 ...

  10. Struts2中的Unable to load configuration错误的分析与解决方法

    当我们遇到 Unable to load configuration. 这样的错误时,可以根据具体的错误提示找出错误的原因. Unable to load configuration. - inter ...