Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)
2010-01-08 08:43
756 查看
在目录中我计划对权限管理,异常管理,事务管理,日志管理,异常管理等项目中AOP典型应用场景进行详细的描述,本篇我们用Unity的Interception来实现项目中的事务处理。
为啥要用AOP
由于这是第一篇写关于AOP的场景,所以我觉得有必要通俗的说明一下在项目中使用AOP的好处。按照弦哥的惯例,关于AOP大套的理论大家自己去google吧,我下面举一个通俗的例子来说明。比如在项目中我们有一个业务逻辑的方法:
我们可以看到他相对来说“很干净”,只有他本身应该内聚的业务逻辑。
接下来项目要求这个干净的业务逻辑方法 需要支持:拦截异常并向上层重新抛出异常;记录异常日志;记录操作日志(如操作人,操作时间,执行时间等..);因为里面多次更新数据库要绑上事务回滚;要进行权限控制。于是乎他变成了下面这样一个“不干净”的业务逻辑方法:
代码
在Facade层把Services层接口简单“包装”一下,然后就可以在Presentation层(Asp.Net MVC的Controller)使用了,代码我就不写了,上篇和前几篇都有讲过了
源码:所有实现代码都贴出来了,且也偷了下懒没按照惯例写我们“土土的测试”。写下篇的时候再上源码吧:)
为啥要用AOP
由于这是第一篇写关于AOP的场景,所以我觉得有必要通俗的说明一下在项目中使用AOP的好处。按照弦哥的惯例,关于AOP大套的理论大家自己去google吧,我下面举一个通俗的例子来说明。比如在项目中我们有一个业务逻辑的方法:
public void 我是一个干净的业务逻辑方法() { 我的N行业务逻辑代码.... 我的N行业务逻辑代码.... 我的N行业务逻辑代码.... 我的N行业务逻辑代码.... }
我们可以看到他相对来说“很干净”,只有他本身应该内聚的业务逻辑。
接下来项目要求这个干净的业务逻辑方法 需要支持:拦截异常并向上层重新抛出异常;记录异常日志;记录操作日志(如操作人,操作时间,执行时间等..);因为里面多次更新数据库要绑上事务回滚;要进行权限控制。于是乎他变成了下面这样一个“不干净”的业务逻辑方法:
代码
public static class ContainerFactory { public static IUnityContainer GetContainer() { IUnityContainer Container = new UnityContainer(); ExeConfigurationFileMap infraFileMap = new ExeConfigurationFileMap(); infraFileMap.ExeConfigFilename = HttpContext.Current.Server.MapPath("~/unity.di.infrastructure.config"); UnityConfigurationSection infraConfig = (UnityConfigurationSection)ConfigurationManager .OpenMappedExeConfiguration(infraFileMap, ConfigurationUserLevel.None) .GetSection("unity"); if (infraConfig.Containers.Default != null) { infraConfig.Containers.Default.Configure(Container); } //上面是上篇讲的DI依赖注入XML文件的读取,下面是本篇讲的AOP的XML文件读取 ExeConfigurationFileMap infraAopFileMap = new ExeConfigurationFileMap(); infraAopFileMap.ExeConfigFilename = HttpContext.Current.Server.MapPath("~/unity.aop.infrastructure.config"); UnityConfigurationSection infraAopConfig = (UnityConfigurationSection)ConfigurationManager .OpenMappedExeConfiguration(infraAopFileMap, ConfigurationUserLevel.None) .GetSection("unity"); if (infraAopConfig.Containers.Default != null) { infraAopConfig.Containers.Default.Configure(Container); } return Container; } }
在Facade层把Services层接口简单“包装”一下,然后就可以在Presentation层(Asp.Net MVC的Controller)使用了,代码我就不写了,上篇和前几篇都有讲过了
源码:所有实现代码都贴出来了,且也偷了下懒没按照惯例写我们“土土的测试”。写下篇的时候再上源码吧:)
相关文章推荐
- Asp.Net大型项目实践(5)-用Unity实现层与层之间的接口调用(附源码)
- Asp.Net大型项目实践(6)-用Unity实现层与层之间的接口调用(附源码)
- Asp.Net大型项目实践系列第二季(二)Windows桌面的ExtJs4实现(含源码) [转]
- Asp.Net大型项目实践(9)-ExtJs实现系统框架页(非iframe,附源码,在线demo)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之实现基本的数据库访问(附源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之实现基本的数据库访问(附源码)
- Asp.Net大型项目实践系列第二季(二)Windows桌面的ExtJs4实现(含源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之NHibernate的Session管理与初始化(附源码)
- Asp.Net大型项目实践(5)-独家资料!整合NHibernate与Json序列化(附源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之多表关联查询(附源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之多表关联查询(附源码)
- Asp.Net大型项目实践(5)-独家资料!整合NHibernate与Json序列化(附源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之分页与排序(附源码)
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
- Asp.Net大型项目实践(10)-基于MVC Action粒度的权限管理(在线demo,全部源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之分页与排序(附源码)
- Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
- Asp.Net大型项目实践(4)-用NHibernate保存和查询我们的业务领域对象之多条件组合查询(附源码)
- Asp.Net大型项目实践(8)-从最简单开始一个ExtJs做的登录页(附源码,在线demo)
- Asp.Net大型项目实践(2)-新建项目及分层(附源码)