上文介绍了我选择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. bash 源码分析

    下载解压 bash-3.2 编译bash export LFS=/my/soft/mylfs tar xvf $LFS/sources/bash-3.2.tar.gz -C $LFS/sources/ ...

  2. c#文本转语音以及语音阅读小实例

    c#实现语音阅读以及文本转语音文件是基于c#的一个类库(SpeechSynthesizer )实现的,使用该类必须要添加引用using System.Speech.Synthesis;直接是无法添加引 ...

  3. 自定义委托类型 - .Net自带委托类型

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递. 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用. 一.自定义委托类型 1.语法结构:访问修 ...

  4. ubuntu下出现的问题-控制台更新源失败

    Ubuntu下控制台输入sudo apt-get update之后出现的问题:E: Could not get lock /var/lib/apt/lists/lock - open (11: Res ...

  5. homework-01

    我的GitHub账户名是Firedamp. 其实我最一开始看到最大子序列的和这个题目,最先想到的就是最简单的O(n^3)的算法,在课堂上教的也确实是这个程序,但是这种算法的时间复杂度必然是最高的,在数 ...

  6. .Net程序员之不学Java做安卓开发:Android Studio中的即时调试窗口

    对学.Net的人来说,JAVA开发是一场噩梦. .net中的即时窗口,调试时直接在里面写代码,对程序中的各种方法/属性进行调用,很方便. Android Studio中找了好久,参考如下网址,也有类似 ...

  7. 远程桌面连接 win7 主机提示“您的凭据不工作”的解决办法

    搞了大半天,找了百度N中方式操作,至少翻看10种以上解决方式,结果还是不得行 索性使用了360搜索,搜了几次就搞定了. 解决办法: “ 最重要一点, 主机上要允许用户以非guest身份登录:主机上运行 ...

  8. SDOI 2016 排列计数

    题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列 保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可 #include<bits/stdc++. ...

  9. Web应用程序的自动化测试库-FluentAutomation

    FluentAutomation是流畅的自动化应用编程接口,支持Selenium和WatiN 连同它们所有的风格和驱动程序.自从Fluient支持Selenium,那就意味着你可以使用Selenium ...

  10. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...