在《企业级应用架构》系列文章发表之余,也得到了许多同行的反馈,有人说这套框架太重了或者技术学习太复杂了或者初学者不太好理解或者完全颠覆了传统APS.NET开发模式让人望而生畏。这些理由在笔者看来确实是问题,但笔者也不得不说,那样的框架组合架构在某些企业级应用中是必须的,因为它有着传统asp.net开发模式无可比拟的多项优势,还望初学者能够坚持下来。
      另外鉴于此,经过我亲身实践项目,现推出一个更加轻量级,更容易学习,更适合许多公司日常开发的部门级管理系统业务的新框架体系结构。这就是本文今日的主题。
主要框架组件:ASP.NET、Spring.NET、NHibernate、Log4Net、NUnit、Membership、EasyUI
架构图:
     下图来源于笔者实际项目架构图。
         
 
         总体来说,项目架构依然实现经典的三层架构,前端MVC模式采用多数人熟悉的基于事件通信模式的ASP.NET框架,这是一个优秀的MVC实现模式,在经典Java EE中,sun公司也将这种基于事件通信模式的JSF作为前端MVC的标准。而Spring.Net和NHibernate的作用和地位,我也不多说了,相信看过前面的系列文章的同行早已知晓。
         在我们许多管理系统中因为很多都是些增删改的数据逻辑操作,所以我们的Service层就会变得很瘦,因为许多构建数据查询条件的代码都被分离到Dao层中去了。故与之前的架构相比我们少了隔离层,但在这里我们将原来在隔离层中的数据验证、类型转换、异常捕获等工作全部交由Service来完成,这样变可以减少一个中间层,同时也不会让Service层感觉到太瘦小。
        另外一个重要应用是,任然使用DTO(数据传输对象模式)作为业务层和表现层数据交换的载体,与数据实体(或领域层)彻底隔离,这样做的好处是相当明显的,不会让底层业务对象参与到表现层中来,从而达到解耦的目的。虽然这样也在一定程度上增加了代码量,但我觉得还是很值得的,这些代码不会很复杂,只是多一点而已。有个方法是Domain中的数据库实体和DTO中的对象都可以使用模版来生成,且完全可以保持DTO实体的属性和Entity的属性是完全相同的,我的意思是一次性生成DTO时,开发过程中DTO属性肯定是要扩展的,因为DTO包装的数据应该直接反映页面的需求,如:一个员工所属的部门名称,这在Entity类中员工实体需要访问部门实体的名称属性才能得到,但DTO对象就不用了,可以直接在员工类中自定义其部门名称,在Service层中直接将这个名称赋值给员工DTO对象的该属性即可,这样前端表格取数据时可以直接绑定该属性,这可以最大程度的减少表现层代码,从而降低表现层耦合度。达到业务代码级重用。自定义属性可以使用C#语法中的Partial关键字声明DTO对象实现,这样同样可以降低DTO模版生成类和自定义类之间的耦合,如果你觉得由Entity转Dto对象代码量大,你也可以选择使用AutoMapp这样的中间件来帮助你。说道这里可能有点复杂,下面给个简单的图示说明之。
      
      Common为公共组件或代码模块,其也有一个抽象层,比如说Log4Net组件,他是属于第三方组件,且几乎每个层都会使用到,所以我们不好将其归为某个一层而使用,而是将其归为公共层。其使用一个接口访问,那是因为我们应用程序不需要强制依赖这个Log4net组件,而将来可以任意更换为别的日志组件如果有更好的。这样就可以做到更高级别的应用程序重用效果。
     NUnit涉及到两层,但它不作为应用程序的一部分发布。一帮来说,单元测试需要测试Dao层和Service层。如果你的系统简单,只测试Service层也可以。
     本系统Dao异常捕获使用了Spring.net的AOP技术,这样可以让Dao层代码看起来更加简介。
     本文章只提供基本的架构示例代码,不会提供完整的项目事例,这是为了保护原公司著作权和版权。另外提供生成Dto和Domain、Dao等层和相关配置文件的生成模版(Codesmith)。具体使用我不详述。注意这个模版生成的实体对象对于自关联的实体,还需要手动修改其对于自身引用对象赋null值,否则会引发堆栈溢出异常!另外还有一些一对多关系,也需要手动添加解决。望大家见谅!这些问题需要你比较了解NHibernate。如果对本架构有不理解之处,请参见笔者之前《企业级应用架构XXX》系列文章。
运行本事例,请自行下载NorthWind数据库。
示例代码:

.NET企业轻量级开发框架(APS.NET+Spring.Net+NHibernate)的更多相关文章

  1. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  2. 《HiWind企业快速开发框架实战》(3)使用HiWind创建和管理菜单

    <HiWind企业快速开发框架实战>(3)使用HiWind创建和管理菜单 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

  3. 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目

    <HiWind企业快速开发框架实战>(2)使用HiWind创建自己的项目 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

  4. 《HiWind企业快速开发框架实战》(1)框架的工作原理

    <HiWind企业快速开发框架实战>(1)框架的工作原理 1.HiWind架构 HiWind的基本架构如下: 持久层部分:同时为框架本身的业务服务,也为开发人员的自定义业务服务. 逻辑层: ...

  5. 初识轻量级Java开源框架 --- Spring

    初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...

  6. NET中小型企业项目开发框架系列(一个)

    当时的前端,我们开发了基于Net一组结构sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,如今把整个开发过程中的步步进展整理出来和大家分享,这个系列可 ...

  7. 下一个系列学习列表Spring.net+NHibernate+MVC

    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 刘冬.NET 2011-08-19 ...

  8. NHibernate框架与BLL+DAL+Model+Controller+UI 多层架构十分相似--『Spring.NET+NHibernate+泛型』概述、知识准备及介绍(一)

    原文://http://blog.csdn.net/wb09100310/article/details/47271555 1. 概述 搭建了Spring.NET+NHibernate的一个数据查询系 ...

  9. Spring.Net+Nhibernate

    Spring.net+Nhibernate系列优秀文章导航 冬哥的Spring.Net+Nhibernate Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 NH ...

随机推荐

  1. js事件处理相关-实现一个div的拖拽

    最终代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  2. [转] Asp.Net 导出 Excel 数据的9种方案

    湛刚 de BLOG 原文地址 Asp.Net 导出 Excel 数据的9种方案 简介 Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式.Tab格式.website ...

  3. DataReader方式 获取数据的操作

    一.使用DataReader读取为对象List /// <summary> /// 获得数据列表List<>,DataReader 使用参数的 /// </summary ...

  4. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  5. postgresql编译安装与调试(二)

    接前文postgresql编译安装与调试(一),继续说说postgresql的编译安装与调试. 上一篇已经详细说明了如何在Linux系统上编译安装postgresql,这次我们在此基础上简单讲讲如何在 ...

  6. [Everyday Mathematic]20150217

    设 $f:\bbR\to\bbR$ 二阶可微, 适合 $f(0)=1$, $f'(0)=0$, 并且 $$\bex f''(x)-5f'(x)+6f(x)\geq 0. \eex$$ 试证: $$\b ...

  7. 【LR】安装LR11后遇到的问题

    (1)问题:录制脚本时无法弹出IE浏览器 解决方法: 正确的是C:\Program Files (x86)\Internet Explorer\iexplore.exe 错误是:C:\Program ...

  8. 整合git与wingIDE(代码下载)

    通过多次被IDE的闪退崩溃甚至无教程调教后,我深刻认识到开发wingIDE这种IDE的小公司,在很多功能方面就是个坑…… 所以,如果你的电脑比较好,运行pycharm无压力,建议略过此文,直接去用py ...

  9. python发布模块的原理及部分讲解

  10. HTML5_画布_太阳系

    HTML5_画布_太阳系 一.canvas属性和方法的简单介绍①对于不支持canvas标签的浏览器需要显示"不支持canvas"使用IE11浏览器的开发人员工具,仿真:文档模式=8 ...