上文介绍了我选择EasyUi作为前端框架的原因,并发放了最新Demo。本文将对这个Demo进行一些介绍,以方便你能够顺利运行起来。

  这个Demo运行起来以后,是EasyUi的一个简单CRUD操作,数据库中也只有一个简单的表,整个操作不带任何业务逻辑。

  看到这里,不少朋友难免感到失望,搞这么复杂一个架构,就只用来实现一个简单的CRUD操作,不是大炮打蚊子吗?

  不要急,我的目的不是教你如何实现CRUD,我还没有这么无聊,我是希望通过这个简单的CRUD操作,帮你引出一些框架特性,大致包括下面内容。

  1. 分层架构,虽然是一个简单的CRUD,但基本的构造块都包含进来了,还有一些没介绍到的构造,比如领域服务等,我会在后续提供其它示例时再引入。我前面也已经介绍过一些构造,还没介绍到的会补上来。
  2. 抽象和封装CRUD操作,虽然CRUD貌不惊人,但不论多复杂的系统,多少有一些CRUD的机械工作,对于简单的系统,CRUD则占据大半江山,所以对CRUD抽象和封装是有必要的。
  3. Mvc控件封装,我将以封装EasyUi控件为例,为你详细介绍如何把Html封装起来,并使用Lambda表达式为你做更多的工作。
  4. 依赖注入,对于这种比较复杂的架构,依赖注入框架是必须的,如果没有它,这种架构用起来就非常痛苦了。
  5. 查询封装,我已经花了很多篇幅来介绍对查询的一些封装支持。通过这个示例为你介绍简单查询,你会感受到查询封装的必要性,你平时那些杂乱无章的查询条件判断已经消失无踪了。对于复杂的查询,需要配合Linq 语句,更复杂的采用Sql,我以前通过存储过程的方式解决,不过发现分页和条件判断不太方便,最近我将Dapper引入,并封装了Sql查询组件,用来自动拼接Sql,提供了条件自动判断和分页等功能,待有需要的时候我会放出给大家参考。
  6. 全局异常处理。通过一个简单的全局异常处理模型,并配合自定义异常Warning,可以解决大部分异常处理问题。
  7. 日志封装。系统一旦部署出去,你的断点调试就不管用了,这时查找问题将主要依赖日志。哪怕在开发阶段,断点调试也不是一个高效的排错手段,通常在查看日志无法解决问题时才进行断点调试。大部分人采用Log4.Net进行日志处理,是不是引入Log4.Net就万事大吉了呢。Log4.Net只是一个底层组件,帮你把需要记录的信息保存一下而已。至于需要记录哪些信息,这是你应该考虑的,如果你的每条日志都需要记录大量的系统信息,比如Ip、线程号一类的东西,你不进行封装,就意味着开发人员每次调用日志组件时,需要自己手工设置。日志更高级的用法,甚至能帮你进行性能调优。
  8. Excel文件导出封装。文件导出是一个常规操作,大部分时候都会导出为Excel格式。我以前采用简单的CSV格式,CSV格式使用逗号分隔各列数据,主要优势是简单,毛病是没有样式,更别说多表头。本次引入NPOI,并对多表头设置进行了高度封装,以大家熟悉的RowSpan和ColumnSpan的方式进行设置,大副简化了NPOI的操作。
  9. 测试数据生成。我们平时开发一个新模块,为了进行测试,一般需要录入一些数据,这些操作多半是手工进行。大部分人都知道偷懒,只是意思一下,随便录入几条,不过很多问题只有达到一定数据量才能有效测试。通过几个简单扩展和封装,就可以为简单模块生成批量测试数据。
  10. 代码生成。无论如何努力的封装和抽象,你最终发现还是有一些代码需要来回复制,这就是代码生成器上场的时候到了。我将为你简单介绍CodeSmith,以及CodeSmith自带的EF Code First模板,你会发现简单修改就可以用于生产环境了。不仅如此,还会把我整理的CodeSmith模板分享出来,这套模板是根据Util量身定制的。

  在看完以上介绍后,希望你能够增强对本系列文章的信心。

  我这个系列主要分享的是应用程序框架的搭建和封装经验,这些代码只是给你参考用的。我并不会随时关注性能问题,因为我平时的项目要求并不高,所以代码中总是采用最省力的方式,比如反射,查询时获取全部字段等,我仅在确实碰到性能问题时才进行局部调优。

  下面先介绍Demo的目录结构。

  Applications包含一个VS解决方案,它是你能够运行的应用程序,这个解决方案采用了DDD架构分层。

  为了示例的真实性,我将应用程序和应用程序框架分到了两个VS解决方案中,这一点非常重要,这样可以显著减少应用程序的编译时间,另一个好处是可以对团队成员透明,减少复杂度。所以Applications依赖一些DLL,这些DLL被指定到一个目录,这就是Release。管理DLL有很多方式,标准方式是Nuget,如果你喜欢,请自行创建。

  Util目录包含另一个VS解决方案,这个就是应用程序框架。我已经将Release目录中的DLL删除,这样做是为了节省空间,你只需要编译Util解决方案,相关的DLL就会生成到根目录的Release中,这是因为我更改了每个类库的生成路径。

  当你打开Util解决方案,你会发现某些项目中包含名称为00-Source的目录,这个目录中包含了某个第三方开源框架的源码,这样做的唯一原因是为了减少生成的DLL。如果你以后也准备这样干,需要注意将该开源框架的条件编译符号复制到你的项目。

  TestBin目录用于放置测试项目生成的DLL,没有特别的用途,只是方便统一管理测试DLL,以免每个目录都包含一堆垃圾。

  Libraries目录是依赖的一些第三方DLL。

  Data目录包含一个Sql Server 2005的备份文件,里面是一个单表,有1万行测试数据。

  上面介绍了目录情况,现在你得把Demo运行起来。

  第一步打开Util解决方案编译。

  第二步打开Applications中的解决方案,编译。

  第三步还原Sql Server数据库,记住还原,不要附加。

  第四步修改连接字符串,这些基础的不要我说了吧。

  第五步,设置Managements.Presentation项目为启动项目,运行。

  如果没什么意外的话,你应该能跑起来了,如果不行,注意你的开发环境与我的可能有差异。我使用的是VS 2013,MVC 4.0,还有一些人发现他的MVC版本是4.0.1,你本机如果没有Mvc 4.0的DLL,找别人给你发几个4.0的DLL就可以了。

  目前发出的Demo没有包含上面所述的全部功能,我会在即将介绍到相关功能时更新,请关注。

  还有些朋友反应看不太懂,不要急,这是正常人的反应,看别人的东西总是很头痛,你可以暂时不要看Util解决方案,先把Applications解决方案看熟,我后面会逐步介绍各构造块。

  后续Demo,不再通过EMAIL方式发放,以免污染评论区。

  最后,希望大家狂点推荐,少点反对,嘿嘿。

  .Net应用程序框架交流QQ群: 386092459,欢迎有兴趣的朋友加入讨论。

  谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/xiadao521/

应用程序框架实战二十九:Util Demo介绍的更多相关文章

  1. 应用程序框架实战二十二 : DDD分层架构之仓储(层超类型基础篇)

    前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能. 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合.仓储中有很多操作都是可以通用的,可以把这部分操作抽取到 ...

  2. 应用程序框架实战三十六:CRUD实战演练介绍

    从本篇开始,本系列将进入实战演练阶段. 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠.不过我的精力很有限,文章进度 ...

  3. 微信小程序把玩(二十九)video组件

    原文:微信小程序把玩(二十九)video组件 视频播放组件与图片加载组件也没啥差别,使用起来也没啥注意的 重要属性: wxml <!--监听button点击事件--> <button ...

  4. 【WePY小程序框架实战二】-页面结构

    [WePY小程序框架实战一]-创建项目 项目结构 |-- dist |-- node_modules |-- src | |-- components |-- a.wpy |-- b.wpy |-- ...

  5. 应用程序框架实战三十八:项目示例VS解决方案的创建(一)

    进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的 ...

  6. 应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较

    本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较. 领域实体为何不能一统江湖? 当你阅读 ...

  7. 应用程序框架实战三十:表现层及ASP.NET MVC介绍(一)

    本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考<ASP.NET MVC4 高级编程>,作者Jon G ...

  8. 应用程序框架实战二十一:DDD分层架构之仓储(介绍篇)

    前面已经介绍过Entity Framework的工作单元和映射层超类型的封装,从本文开始,将逐步介绍仓储以及对查询的扩展支持. 什么是仓储 仓储表示聚合的集合. 仓储所表现出来的集合外观,仅仅是一种模 ...

  9. Java并发编程原理与实战二十九:Exchanger

    一.简介 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exchange是最简单的也是最复杂的,简 ...

随机推荐

  1. CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)

    CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)   在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...

  2. JAVA实现AES 解密报错Input length must be multiple of 16 when decrypting with padded cipher

    加密代码 /**解密 * @param content 待解密内容 * @param password 解密密钥 * @return */ public static byte[] decrypt(b ...

  3. 解析文件+AcitonBar展示:

    //项目效果:

  4. ntfs-3g

    CentOS默认源里没有ntfs3g,想要添加ntfs支持,无非是自己下载编译安装或者加源yum安装. 昨天重新安装了一个CentOS7,用的是添加aliyun的epel源来yum安装的方式,简单易行 ...

  5. Ajax的js库分析简化版

    Ajax jquery的库的简化版本 (function(){    //面向外界的唯一变量接口!    var myajax = window.myajax = {};    //作者.版本号等等信 ...

  6. Android课程---关于Service的学习(后台运行)

    MainActivity.java package com.hanqi.test2; import android.content.ComponentName; import android.cont ...

  7. for循环后面跟分号 - for (i = 0; i <= 3; i++);这不是错误语句

    #include<iostream> int main() { using namespace std; ; ; i <= ; i++); t = t + i; cout <& ...

  8. SQL Server 数据变更时间戳(timestamp)在复制中的运用

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...

  9. ENode框架Conference案例分析系列之 - Quick Start

    前言 前一篇文章介绍了Conference案例的架构设计,本篇文章开始介绍Conference案例的代码实现.由于代码比较多,一开始就全部介绍所有细节,估计很多人接受不了,也理解不了.所以,我先进行一 ...

  10. eventbus 备注

    Event在整个系统中是单例的. EventBus.getDefault().register(this); 注册 EventBus.getDefault().unregister(this); 注销 ...