随笔分类 -  领域驱动设计

专注于领域驱动设计的研究与实践
摘要:在《EntityFramework之领域驱动设计实践【后续篇】:基于EF 4.3.1 Code First的领域驱动设计实践案例》一文中,我给出了一个基于Entity Framework 4.3.1 Code First的领域驱动设计实践案例:Byteart Retail。此案例得到了广大读者朋友的关注,也有很多网友针对案例中的各种实现技术进行提问,我也基本上一一回答了大家的疑问。为了能够更好地演... 阅读全文
posted @ 2012-06-20 11:00 dax.net 阅读(12870) 评论(80) 推荐(12) 编辑
摘要:两年前我在博客中发布了《EntityFramework之领域驱动设计实践》系列文章,也得到了广大读者朋友的关注,在完成了系列文章的总结之后,也一直没有这部分内容的更新了。现在,Entity Framework的稳定版(就是那个Stable的版本,不是Entity Framework 5的beta版本)4.3.1已经逐步应用到各种.NET项目中,为了演示Entity Framework 4.3.1 Code First编程模式以及其它的一些.NET技术在领域驱动设计实践上的应用,我重新采用经典的分层架构(也就是类似Microsoft NLayerApp的区别于CQRS的架构)实现了一个案例程序: 阅读全文
posted @ 2012-04-16 21:07 dax.net 阅读(21999) 评论(125) 推荐(28) 编辑
摘要:聚合以及聚合根是领域驱动设计中的重要概念,根据定义,聚合是针对数据变化可以考虑成一个单元的一组相关的对象。聚合使用边界将内部和外部的对象划分开来。每个聚合有一个根。这个根是一个实体,并且它是外部可以访问的唯一的对象。根可以保持对任意聚合对象的引用,并且其他的对象可以持有任意其他的对象,但一个外部对象只能持有根对象的引用。如果边界内有其他的实体,那些实体的标识符是本地化的,只在聚合内有意义(参见《领域驱动设计-精简版》第42页)。从定义上看,貌似针对特定上下文的领域模型来讲,聚合的划分与设计并不那么困难,但事实却并非如此。在本文中,我将大致总结一下自己的经验,同时也欢迎关注领域驱动设计的朋友能够 阅读全文
posted @ 2011-12-24 10:00 dax.net 阅读(12117) 评论(33) 推荐(11) 编辑
摘要:Apworks是一套基于.NET的面向领域驱动的企业级应用系统开发框架,开发人员可以使用Apworks方便地在项目中应用经典的分层架构(Classic Layered Architecture)模式或命令查询职责分离(CQRS)架构模式。经过我9个月的努力,Apworks已经从去年年底发布的具有有限功能的预览版(Alpha版)发展到现在能够支持实际项目开发的2.0稳定版,如今该稳定版已经发布到co... 阅读全文
posted @ 2011-09-15 12:26 dax.net 阅读(4857) 评论(22) 推荐(4) 编辑
摘要:在上一篇文章中,我给出了一个完整的CQRS架构的演示案例:Tiny Library CQRS。本文将介绍该案例中AOP拦截的实现方式,以及基于AOP拦截的异常处理。由于Tiny Library CQRS是基于Apworks框架开发的CQRS架构案例,因此通过本文你也将了解到,如何配置Apworks框架以便在自己的实际项目中使用AOP拦截和异常处理。实现AOP拦截如上所述,Tiny Library CQRS利用了Apworks框架实现AOP拦截,那么首先来了解一下Apworks支持AOP拦截的方式。Apworks采用Castle DynamicProxy实现AOP拦截,因此针对AOP拦截部分的开 阅读全文
posted @ 2011-09-07 10:26 dax.net 阅读(4811) 评论(8) 推荐(2) 编辑
摘要:如果您不了解CQRS架构中各个系统或组件是如何组织在一起并协调工作的,或者您不了解CQRS架构中事件溯源、快照、领域仓储、消息派发、消息同步等是如何实现的,或者您甚至不了解什么是领域驱动设计、什么是事件驱动架构(Event-Driven Architecture)以及什么是CQRS架构(Command-Query Responsibility Segregation Architecture),那么本文,以及Tiny Library CQRS实践案例,就是您正需要的。Tiny Library CQRS(http://tlibcqrs.codeplex.com)是基于.NET与Apworks(h 阅读全文
posted @ 2011-09-01 13:52 dax.net 阅读(5499) 评论(18) 推荐(5) 编辑
摘要:概述同步服务(Synchronization Service)在CQRS架构中有着重要的作用。它通过访问事件总线来读取事件数据,并对事件进行派发。应用程序会向同步服务注册事件处理器,以便同步服务在派发事件的过程中,能够通过事件处理器对事件进行处理。在此,我将针对“查询数据库的同步”这一基本的CQRS应用场景,来给出一种最简单的同步服务实现方式。回顾一下CQRS架构,在《EntityFramework之领域驱动设计实践【扩展阅读】:CQRS体系结构模式》一文中,我给出了一个简单的CQRS架构模型图,在该图的“事件总线(Event Bus)”与“查询数据库(Query Database)”之间,有 阅读全文
posted @ 2011-08-11 09:20 dax.net 阅读(6380) 评论(10) 推荐(3) 编辑
摘要:在上一篇文章《.NET应用框架架构设计实践 - 概述》的评论部分,有网友提出了一个在面向领域驱动架构的实践中比较常见的问题:“DDD使用聚合根访问,那例如那些通用查询如何实现?难道都要经过聚合根多步得到么?DDD如何实现关联表的查询,例如3表关联查询?”这个问题比较泛,涉及的内容也比较多,我就单独一篇文章介绍一下我对这个问题的看法。关于上面问题中的“通用查询”- 呃,这个定义比较模糊,我只能给出我的一些想法或者经验性的东西,我在本文中的经验与观点并不一定会100%适合您的应用场景,但我想应该还是具有一定指导性意义的。聚合与聚合根我想,还是从聚合根谈起吧。聚合根是DDD中的概念,不管是经典的DD 阅读全文
posted @ 2011-08-03 10:11 dax.net 阅读(16928) 评论(50) 推荐(17) 编辑
摘要:原本不打算写这篇的,因为之前基本上每篇文章都有总结部分,因此,在系列文章结束的时候,需要总结的内容并不多;但正如刚刚所说,经过几个月的努力,本系列文章也到了该结尾的时候,于是还是做个简要的总结吧。我们从《项目简介与环境搭建》开始,了解了NLayerApp的项目概况、先决条件、运行环境以及部署方式,并对该项目所立足的理论基础做了一个非常简单的介绍;接下来的《多层架构与应用系统设计原则》、《DDD、分布式DDD及其分层》两篇文章从理论的角度对软件架构设计原则、分层架构、领域驱动设计、面向领域的多层分布式系统等方面进行了较为详细的介绍;《基础结构层(Cross-Cutting部分)》、《基础结构层( 阅读全文
posted @ 2011-07-19 15:21 dax.net 阅读(5967) 评论(5) 推荐(5) 编辑
摘要:Microsoft NLayerApp采用基于WCF的分布式服务组件为外界(各种类型的GUI)提供了访问接口,客户端程序只需要添加Service引用即可使用NLayerApp应用程序所提供的功能。在NLayerApp中,分布式服务部分的设计与结构还是比较简单的,主要包括DistributedServices.Core、DistributedServices.MainModule以及DistributedServices.Deployment三个项目。DistributedServices.Core该项目为所有位于分布式服务层的组件提供公共的类型定义与功能实现,比如在这个项目中定义了与异常处理相 阅读全文
posted @ 2011-07-19 10:56 dax.net 阅读(5379) 评论(7) 推荐(3) 编辑
摘要:NLayerApp中,在领域模型层之上是应用层与分布式服务(Distributed Services)部分。应用层主要负责接收来自客户端的请求数据,然后协调领域模型层与基础结构层组件完成语义上相对独立的任务;而分布式服务部分则为应用层与客户端之间提供通讯的接口和技术架构,严格地说它已经不具备任何任务处理的责任了,在整个应用程序中是一个可有可无的角色:对于ASP.NET Web应用程序而言,它只需要引用应用层组件的接口,然后通过IoC获得应用层组件实体即可,无需分布式服务的支持。当然,如果还需要考虑与其它系统的集成的话,那么实现一个分布式服务还是很有必要的。今天我们先讨论NLayerApp中的应 阅读全文
posted @ 2011-06-24 13:10 dax.net 阅读(6252) 评论(18) 推荐(5) 编辑
摘要:本文将重点介绍Microsoft NLayerApp的领域模型层,这涉及到Domain.Core、Domain.Core.Entities、Domain.MainModule以及Domain.MainModule.Entities四个项目。Domain.Core项目包含了基本接口的定义以及规约模式(Specification Pattern)的实现;Domain.Core.Entities则包含了支持Entity Framework的STE(Self-Tracking Entity)的实现代码,在上文《Microsoft NLayerApp案例理论与实践 - 基础结构层(数据访问部分)》我对S 阅读全文
posted @ 2011-06-07 16:49 dax.net 阅读(9141) 评论(10) 推荐(5) 编辑
摘要:上篇文章讲解了NLayerApp案例的基础结构层(Cross-Cutting部分),现在,让我们继续解读NLayerApp的基础结构层(数据访问部分)。NLayerApp的基础结构层(数据访问部分)包含如下内容:Unit Of Work(PoEAA)、仓储的具体实现、NLayerApp的数据模型以及与测试相关的类。下面,我们将对前三个部分进行讨论,与测试相关的内容,我打算最后单独一章进行介绍。Unit Of Work(PoEAA)Unit Of Work(UoW)模式在企业应用架构中被广泛使用,它能够将Domain Model中对象状态的变化收集起来,并在适当的时候在同一数据库连接和事务处理上 阅读全文
posted @ 2011-06-03 14:55 dax.net 阅读(11405) 评论(12) 推荐(9) 编辑
摘要:从这篇文章开始,我将逐步介绍NLayerApp的基础结构层、领域层、应用层以及分布式服务层。本文着重介绍基础结构层,根据上文对NLayerApp的架构分析,它将包含两大部分的内容:处理数据访问的基础结构层组件和Cross-Cutting的基础结构层组件。处理数据访问的基础结构层组件主要包含了仓储的具体实现、Unit Of Work(PoEAA,Martin Fowler)的实现、NLayerApp的实体模型定义,以及为单体测试做准备的Service Stubs(PoEAA,Martin Fowler);Cross-Cutting的基础结构层组件则主要包含了IoC(Inversion of Co 阅读全文
posted @ 2011-06-01 16:30 dax.net 阅读(10108) 评论(16) 推荐(12) 编辑
摘要:这段时间一直在忙工作,已经有一个月没更新博客了。从现在开始,我将继续讨论Microsoft NLayerApp案例,希望各位爱好Microsoft NLayerApp案例、架构设计以及DDD的朋友们能够继续关注。从架构上看,Microsoft NLayerApp对“复杂的业务系统应用程序”这样一种应用程序的架构设计提供了一系列的设计准则。所谓“复杂的业务系统应用程序”是指这样一类业务系统应用程序,这类应用程序具有相对较长的生命周期,在其生命周期中,将发生一些可预期的“革命性变更”(比如,所使用的技术/框架的版本升级甚至替换),因此后期维护会变得非常重要。于是,针对这种类型应用程序的设计,我们应 阅读全文
posted @ 2011-05-10 14:01 dax.net 阅读(23040) 评论(17) 推荐(20) 编辑
摘要:在对NLayerApp实际项目进行讨论之前,让我们首先学习一下(或者应该说重温一下)分层/多层架构与应用系统设计原则。很多朋友会认为这些都是老掉牙的内容,只要是软件从业人员,都会对这些内容非常熟悉。然而,果真如此吗?我在这里整理这部分内容,一方面是为介绍NLayerApp打下基础,而另一方面,则是希望借此机会将这些理论性的东西做个归纳,也希望读者朋友能够认真阅读,毕竟温故知新嘛。 需要说明的是,从本章节开始,大多数理论性的东西都源自Microsoft Spain团队针对NLayerApp所编写的《Architecture Guide Book》,事实上这本Guideline的英文版至今也还没有 阅读全文
posted @ 2011-03-03 15:15 dax.net 阅读(14055) 评论(18) 推荐(7) 编辑
摘要:项目简介Microsoft – Spain团队有一个很不错的“面向领域多层分布式项目”案例:Microsoft – Domain Oriented N-Layered .NET 4.0 App Sample(在本系列文章中,我使用NLayerApp作为该项目的名称进行介绍),在codeplex上的地址是:http://microsoftnlayerapp.codeplex.com/。它是学习领域驱动设计(DDD)的一个非常不错的案例项目。该项目采用的是经典的DDD架构,而不是CQRS架构,但我觉得整个案例做的非常不错,基本上包含了基于DDD的架构实践的各个方面。因此,应不少社区朋友的要求,我打 阅读全文
posted @ 2011-03-01 13:21 dax.net 阅读(17820) 评论(13) 推荐(20) 编辑
摘要:启动WCF服务 在TinyLibraryCQRS解决方案下,找到TinyLibrary.Services项目 右键单击CommandService.svc,然后选择View in Browser,这将启动ASP.NET Development Server 当ASP.NET Development Server成功启动,并在浏览器中打开了CommandService.svc后,将出现如下界面 使... 阅读全文
posted @ 2011-02-15 15:12 dax.net 阅读(3382) 评论(7) 推荐(2) 编辑
摘要:Apworks使用配置文件来启动整个系统。在上文中也能够看出,WCF服务在启动时,同时也启动了Apworks系统。所以,本节简要介绍这个WCF服务针对Apworks的相关配置节内容。 双击TinyLibrary.Services项目的web.config文件,根据下面的XML代码编辑该文件。 以上配置文件主要有两个configSection:apworksConfiguration和unityC... 阅读全文
posted @ 2011-02-15 14:27 dax.net 阅读(2976) 评论(6) 推荐(4) 编辑
摘要:到目前为止,我们还未涉及任何数据库的配置工作。本章节将简单介绍基于Apworks的应用程序的数据库配置。在SQL Server中(目前的Apworks版本仅支持SQL Server)创建两个数据库:TinyLibraryEventDB和TinyLibraryQueryDB,然后分别执行如下SQL脚本:TinyLibraryEventDBTinyLibraryQueryDB由于我们所使用的数据库系统是SQL Server,对于上面的TinyLibraryEventDB而言,它就是直接使用的Apworks应用开发框架中自带的SQL脚本。开发人员可以在Apworks的安装目录中找到该脚本文件。就关系 阅读全文
posted @ 2011-02-14 16:31 dax.net 阅读(2124) 评论(0) 推荐(0) 编辑