随笔分类 - .Net应用程序框架实战
摘要:进行项目开发的第一步,是创建出适合自己团队习惯的VS解决方案,虽然我已经提供了项目示例,但毕竟是我创建的,你直接使用可能并不合适,另外你如果尝试模仿重新创建该示例,中间可能碰到各种障碍,特别是项目间的依赖关系。 本文的目的是帮助.Net架构初学者能顺利搭建起适合自己的VS解决方案,我会在本文演...
阅读全文
摘要:离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考。重要更新 这一次对两个VS解决方案均做了大量调整,包含项目结构及命名空间。 Util解决方案的目录截图如下。 除了少数需要配置...
阅读全文
摘要:从本篇开始,本系列将进入实战演练阶段。 前面主要介绍了一些应用程序框架的概念和基类,本来想把所有概念介绍完,再把框架内部实现都讲完了,再进入实战,这样可以让初学者基础牢靠。不过我的精力很有限,文章进度越来越慢,所以准备切换一下介绍顺序,把实战演练提前,以方便你阅读代码。实战演练介绍 本系列实...
阅读全文
摘要:上一篇介绍了我对几种实体的认识,本篇将介绍几种服务的用法。 预告一下本系列后续计划,本篇之后,准备进入实战演练阶段,先介绍如何快速解决CRUD操作,从如何使用PD数据建模到使用CodeSmith生成代码,先带你感受一下,再回过来介绍框架内部元素,以免你在阅读时昏昏欲睡。应用服务介绍 对于一个...
阅读全文
摘要:本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较。领域实体为何不能一统江湖? 当你阅读我或其它博主提供的示例代码时,会发现几种类型的实体,这几种实体初步看上去区别不大,只是名称不同,...
阅读全文
摘要:最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间。不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新。本文继续介绍表现层和Asp.net Mvc,我将在本篇讨论一些重要的设计问题和封装技巧。是否需要将控制器分离为独立项目 经常有人问我,是否有必要将控制器从W...
阅读全文
摘要:本文将介绍表现层及ASP.NET MVC的一些要点,特别是ASP.NET MVC的一些抽象和封装技巧,如果你对MVC还不了解,可以参考《ASP.NET MVC4 高级编程》,作者Jon Galloway等,这本书由ASP.NET MVC团队成员编写,相当不错。表现层的职责 表现层的职责是展示和...
阅读全文
摘要:上文介绍了我选择EasyUi作为前端框架的原因,并发放了最新Demo。本文将对这个Demo进行一些介绍,以方便你能够顺利运行起来。 这个Demo运行起来以后,是EasyUi的一个简单CRUD操作,数据库中也只有一个简单的表,整个操作不带任何业务逻辑。 看到这里,不少朋友难免感到失望,搞这么复...
阅读全文
摘要:对于BS管理系统,我很长一段时间都工作在Asp.Net Web Form上,Web Form的主要优势是可以使用服务器端控件,以类似CS的开发模式进行工作,通过拖拽控件和定义事件处理函数,极大的简化了BS的开发。服务器端控件会在渲染阶段把自身输出为Html标签,对我们完全透明,当需要设置相关属性...
阅读全文
摘要:信息系统的查询需求千变万化,在仓储中为每个查询需求创建一个特殊方法,将导致大量乏味而臃肿的接口。 一种更加可行的办法是,在应用层服务中描述查询需求,并通过仓储执行查询。 为了能够更好的描述查询需求,可以将查询功能从仓储中抽取出来,专门创建一个查询对象。 查询最复杂的部分是条件过滤,这也是查...
阅读全文
摘要:前面已经做了一些准备工作,本篇将介绍查询条件的封装,它是规约模式的一个应用。 规约使用一个对象来封装谓词,我之前已经介绍过它在验证方面的应用,本篇是规约模式在查询方面的应用。 规约的强大之处在于,能够将一堆杂乱无章的条件判断或查询条件封装起来,以一个清晰的概念来表达,并使得这些谓词具备了可复...
阅读全文
摘要:上一篇介绍了IQueryable的Where方法存在的问题,并扩展了一个名为Filter的过滤方法,它是Where方法的增强版。本篇将介绍查询的另一个重要主题——分页与排序。 对于任何一个信息系统,查询都需要分页,因为不可能直接返回表中的所有数据。 如果直接使用原始的Ado.Net,我们可以...
阅读全文
摘要:上面两篇已经作好准备,本文将进行基础查询扩展。当使用了Entity Framework这样的ORM框架以后,我们查询的核心被集中在IQueryable的Where方法上。 如果UI需要通过姓名查询一个客户,会在UI上放置一个输入框作为客户姓名的查询条件。服务端接收以后通过Where方法进行过滤...
阅读全文
摘要:前一篇介绍了仓储的基本概念,并谈了我对仓储的一些认识,本文将实现仓储的基本功能。 仓储代表聚合在内存中的集合,所以仓储的接口需要模拟得像一个集合。仓储中有很多操作都是可以通用的,可以把这部分操作抽取到基类中。 在Util.Domains项目中创建一个文件夹Repositories,这个文件夹...
阅读全文
摘要:前面已经介绍过Entity Framework的工作单元和映射层超类型的封装,从本文开始,将逐步介绍仓储以及对查询的扩展支持。 什么是仓储 仓储表示聚合的集合。 仓储所表现出来的集合外观,仅仅是一种模拟,除了测试以外,没有理由使用内存中真正的...
阅读全文
摘要:上一篇介绍了工作单元层超类型的封装演化过程,本文将介绍对Entity Framework映射层超类型的封装。 使用Entity Framework一般需要映射三种类型的对象,即实体、聚合、值对象。 聚合与实体映射的主要区别是:聚合映射单属性标识Id,并需要映射乐观离线锁Version,而实体...
阅读全文
摘要:上一篇介绍了DDD聚合以及与并发相关的各种锁机制,本文将介绍另一个核心元素——工作单元,它是实现仓储的基础。 什么是工作单元 维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。 这是《企业应用架构模式》中给出的定义,不过看上去有...
阅读全文
摘要:前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题。 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体“充血”,这样可以让业务逻辑高度内聚,并为你提供业务逻辑的唯一访问点。而聚合则是第二步,它将多个相关业务概念包装到单一的概念中,从而...
阅读全文
摘要:上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见。这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践。但是设计与实践的好与坏,对于不同的人,以及处于不同的环境都有不同的诠释,这是一个仁者见仁,智者见智的问题。DDD非常抽象,以至...
阅读全文
摘要:前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持。本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分。 如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不奇怪,因为多年来养成的数据建模思维已经牢牢把你禁锢,以致于你在使用面向对象方...
阅读全文