随笔分类 -  领域驱动设计

专注于领域驱动设计的研究与实践
摘要:在本节,我们将介绍.NET WCF服务的创建过程。在Solution Explorer中,右键单击TinyLibraryCQRS,然后选择Add | New Project…菜单,这将打开Add New Project对话框在Installed Templates 选项卡下,选择Visual C# | WCF,然后选择WCF Service Application,确保所选.NET版本为.NET Framework 4,在Name文本框中输入TinyLibrary.Services,然后单击OK按钮右键单击TinyLibrary.Services的References节点,然后选 阅读全文
posted @ 2011-02-14 16:06 dax.net 阅读(4148) 评论(4) 推荐(1) 编辑
摘要:客户端程序通过命令告知系统“应该做什么”。事实上,这是一种单向的交互过程,客户端程序仅仅向领域模型发送命令请求,它们并不会通过领域模型来查询某些数据信息。在CQRS架构的应用程序中,“查询”是另一部分的内容,这将在接下来的章节中单独讨论。当应用服务器端接收到来自客户端的命令请求后,就会将这些命令推送到命令总线。命令处理器会侦听命令总线,并相应地处理命令请求。现在,让我们在TinyLibraryCQ... 阅读全文
posted @ 2011-02-14 14:51 dax.net 阅读(3941) 评论(0) 推荐(2) 编辑
摘要:根据wikipedia中关于“事件”的描述,“事件”可以被看成是“状态的一次变化”。例如:当一个客户购买了一台汽车,汽车的状态就从“待售”转变为“已售”。汽车销售系统则把这种状态的改变看成是一次事件的产生、发布、检测以及被更多其它应用程序所使用的过程。对于CQRS架构的应用程序而言,事件产生于领域模型,并由领域模型发布事件同时由领域模型首次捕获并处理,因此,我们称之为领域事件(Domain Events)。在Apworks开发框架中,与领域事件相关的代码都被定义在Apworks.Events命名空间下。请使用下面的步骤为TinyLibraryCQRS解决方案添加领域事件。在 Solution 阅读全文
posted @ 2011-01-26 16:10 dax.net 阅读(5455) 评论(13) 推荐(2) 编辑
摘要:由于事件溯源(Event Sourcing)的需要,领域事件需要被保存到外部的存储系统中。由于事件本身描述了在特定对象上所发生的事情,因此,为了能够跟踪对象状态的变化过程以获得Event Audit的能力,我们总是将事件的数据保存在存储系统中,而从来不去删除它们。或许你会认为,这样做有点极端,时间长了,存储系统中的数据量将变得非常庞大。遇到这种情况,你需要引入备份和归档策略,而不是直接将过期的数据删除,因为,存储成本是便宜的,但数据却是有价值的。对于一些生命周期比较长的领域对象而言,发生在它们身上的事件数量会随着时间的推移而增大,甚至会变得巨大。于是,通过使用这大量的事件数据来重建领域模型将变 阅读全文
posted @ 2011-01-26 15:08 dax.net 阅读(3639) 评论(7) 推荐(1) 编辑
摘要:领域模型是应用程序的核心,它包括了领域对象、状态、方法、事件、业务逻辑以及对象之间的关系。现在,我们来为Tiny Library CQRS创建一个领域模型项目。在 Solution Explorer 下,右键单击TinyLibraryCQRS项目,单击 Add | New Project… 菜单,这将打开 Add New Project 对话框 在 Installed Templates 选项卡下,选择 Visual C# | Windows,然后选择 Class Library ,确保所选的Framework版本是.NET Framework 4,在 Name 文本框中,输入TinyLibr 阅读全文
posted @ 2011-01-26 15:07 dax.net 阅读(4116) 评论(2) 推荐(0) 编辑
摘要:在Apworks框架发布Alpha版本的时候,我已经针对其开发案例:Tiny Library CQRS写了Walkthrough文档,地址是:http://apworks.org/custom/documents/wlkthr_BuildAppsUsingApworks/。为了走国际化道路,这篇文章是全英文的,社区里有不少网友表示难以理解。趁着这几天不算很忙,我抽空将其又翻译回中文,并加入更多的批准内容,供爱好DDD、CQRS和架构设计的朋友阅读参考,也希望大家能够积极参加讨论。简介Apworks是一套应用程序开发框架,软件架构师和开发人员可以使用这套开发框架开发出面向领域(Domain-Ce 阅读全文
posted @ 2011-01-26 15:05 dax.net 阅读(7249) 评论(5) 推荐(3) 编辑
摘要:这个问题来源于Apworks应用开发框架的设计。由于命令与查询职责的分离,使得基于CQRS体系结构风格的应用系统的外部存储系统的结构变得简单起来:在“命令”部分,简单地说,只需要Event Store和Snapshot Store来保存Domain Model;而“查询”部分,则又是基于事件派送与侦听的系统集成。之前我也提到过,“查询”部分由于不牵涉到Domain Model,于是,它的设计应该随... 阅读全文
posted @ 2011-01-19 12:34 dax.net 阅读(10209) 评论(4) 推荐(6) 编辑
摘要:有不少网友仍然对CQRS与事件溯源(Event Sourcing)不是很了解,对经典的应用系统架构与CQRS架构之间的差别没有一个大概的认识。本文基本上摘自Greg Young的CQRS Documents一文(由daxnet本人翻译并做了简要的注释),希望能够对应用系统架构的爱好者有所帮助。【注:本文主体内容节选并翻译自Greg Young的CQRS Documents。如需查看原文,请单击此处】一、经典的应用系统结构在了解基于领域驱动设计(Domain Driven Design, DDD)的应用系统之前,首先让我们了解一下经典的应用系统结构。这种经典的应用系统结构往往被认定为设计与开发分 阅读全文
posted @ 2011-01-06 19:50 dax.net 阅读(18527) 评论(3) 推荐(8) 编辑
摘要:领域仓储(Domain Repository)与事件存储(Event Store)是CQRS体系结构应用系统中C部分(Command部分)的重要组件。虽然都是存储机制,但两者有着本质的区别:领域仓储是属于领域层的,而事件仓储则是属于基础结构层的。领域模型产生事件,领域仓储负责保存、发布事件,并通过事件序列重塑领域模型。由于领域仓储的存在,使得“内存领域模型(In-memory Domain)”成为可能。在上文中我已经对对象的状态做了一些介绍,通过这些介绍我们能够了解到,在应用系统中,是领域事件导致了对象状态的变化,于是,我们只需要把这些领域事件按顺序记录下来,我们就有能力将领域模型还原到任何. 阅读全文
posted @ 2011-01-04 19:45 dax.net 阅读(6038) 评论(4) 推荐(2) 编辑
摘要:Tiny Library CQRS的介绍文章有好些日子没有更新了,因为最近一直在忙着发布Apworks应用开发框架。原本打算在2011年1月1日发布,以迎接新年的到来,后来确定了还是在2010年12月31日发布,就算是给过去的一年做个留念。哈哈。一直关注我的博客的园友都知道,之前我的一些领域驱动设计的案例,都是以Apworks为基础的。由于时间关系,Apworks一直没有一个固定的版本,所以在那些案例中,我都是将Apworks的程序集加入了案例的发布包里。现在,终于能够为Apworks整出一个“可用”的版本,并将其发布到了codeplex上,地址是:http://apworks.codeple 阅读全文
posted @ 2010-12-31 10:56 dax.net 阅读(3920) 评论(5) 推荐(3) 编辑
摘要:从结构上看,tlibcqrs项目并不复杂,但对其进行介绍,的确让我感到有点无从着手。还是先从领域模型中的对象的行为和状态谈起吧。先来谈谈对象状态。据我理解,状态就是一种数据,它用来描述,在某个特定的时间上,这个对象所具有的特质,它将作为对象行为发生的依据和结果。我们平时做设计和编程的时候,尤其是在做数据访问层的时候,特别喜欢一些仅仅包含getter/setter属性的对象,以便调用方能够通过getter获得对象的状态,使用setter设置对象的状态。之前我也说明过,状态并非getter/setter属性,在OOP上,状态表现为“字段”(fields)。现在我们讨论的不是数据访问层的DAO,而是 阅读全文
posted @ 2010-12-22 13:04 dax.net 阅读(4125) 评论(22) 推荐(4) 编辑
摘要:写在前面也许在阅读了上篇文章中我列出的那部分资料后,还是有很多朋友对领域驱动设计不了解。正如上文评论中有网友提到微软西班牙团队也做了一个面向领域的分布式应用系统架构的案例,地址是http://microsoftnlayerapp.codeplex.com/。在这个站点的首页上,又对领域驱动设计做了诠释,我觉得总结的很好,特地将其翻译成中文写在这里,供大家参考:DDD is much more than this!We're talking about complex apps…, all their business rules (Domain logic) are points th 阅读全文
posted @ 2010-12-15 10:29 dax.net 阅读(6256) 评论(13) 推荐(4) 编辑
摘要:写在前面有段时间没有更新博客了,一方面因为工作繁忙,另一方面则是我最近一直在坚持设计和完善基于DDD的应用系统开发框架Apworks。读过我《领域驱动设计案例:Tiny Library》这一系列文章的朋友一定听说过Apworks框架,虽然这个框架至今仍未成熟到能够用在真正的系统开发上,但它已经实现了CQRS体系结构模式,已经可以用于软件架构设计的演示上了。从这一讲开始,我将逐步介绍如何采用CQRS架构实现Tiny Library的业务。你可能会听得烦了:又是Tiny Library,能不能换点别的?呵呵,我开始时想做一个简单的论坛出来,不过为了能让读者朋友在经典DDD实践和CQRS实践上做个对 阅读全文
posted @ 2010-12-14 15:17 dax.net 阅读(7014) 评论(15) 推荐(4) 编辑
摘要:工作繁忙,很久没有更新博客了。下面言归正传,简单介绍一下Tiny Library的用户界面实现。如前所述,Tiny Library采用ASP.NET MVC框架实现了基于浏览器的用户界面。回顾一下《业务逻辑与系统结构》一文,从层次架构图中我们可以清楚地看到,用户界面层是通过WCF Services与系统交互的。为了快速简单地实现Tiny Library,我只是简单地使用了ASP.NET MVC,因... 阅读全文
posted @ 2010-11-18 16:49 dax.net 阅读(5874) 评论(7) 推荐(6) 编辑
摘要:今天抽空将我写的与领域驱动设计有关的系列文章汇总于此,便于大家查看。根据撰写的进度,本列表会不定期更新,敬请关注! Entity Framework之领域驱动设计实践 EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTa 阅读全文
posted @ 2010-11-02 17:39 dax.net 阅读(65282) 评论(74) 推荐(124) 编辑
摘要:Tiny Library使用应用服务层向用户界面层提供服务,具体实现是采用Microsoft WCF Services。在Tiny Library的解决方案中,是由TinyLibrary.Services项目为整个系统提供这一WCF服务的。按照传统的应用系统分层方法,TinyLibrary.Services项目位于领域模型层之上、用户界面层之下,它是UI与Domain的交互界面。TinyLibra... 阅读全文
posted @ 2010-11-02 08:11 dax.net 阅读(8057) 评论(11) 推荐(7) 编辑
摘要:在领域驱动设计的案例中,仓储的设计是很具有争议性的话题,因为仓储这个角色本身就与领域模型和基础结构层对象相关,它需要序列化领域对象(应该说是聚合),然后将其保存到基础结构层的持久化机制。于是,在领域驱动设计的社区中,存在两种观点:1、领域模型不能访问仓储,理由是:仓储需要跟技术架构层打交道,在领域模型中访问仓储就会破坏领域模型的纯净度。需要使用仓储的,需要在领域模型上加上一层,比如Applicat... 阅读全文
posted @ 2010-10-28 20:27 dax.net 阅读(8849) 评论(11) 推荐(4) 编辑
摘要:本讲主要介绍基于Entity Framework的领域驱动设计建模。首先回顾一下Tiny Library的业务逻辑: 任何用户可以添加Library中的图书(简化起见,图书不能修改也不能删除),也可以查看图书的详细信息 注册用户,也就是读者,可以借书、还书、查看自己借过的图书列表和借书信息 请注意上面描述的黑体部分,这些概念出现在Tiny Library的领域知识(Domain Knowle... 阅读全文
posted @ 2010-10-27 16:32 dax.net 阅读(16582) 评论(17) 推荐(5) 编辑
摘要:之前我发布了领域驱动设计的一个实践案例:Tiny Library。本章介绍该案例实现的业务逻辑与系统结构设计。业务逻辑Tiny Library的业务逻辑非常简单,主要就是如下两条:任何用户可以添加Library中的图书(简化起见,图书不能修改也不能删除),也可以查看图书的详细信息 注册用户,也就是读者,可以借书、还书、查看自己借过的图书列表和借书信息篇幅有限,我就不在此将案例的操作过程一一截图了,... 阅读全文
posted @ 2010-10-20 08:13 dax.net 阅读(9824) 评论(20) 推荐(3) 编辑
摘要:应广大网友的要求,我最近抽空基于ASP.NET MVC + WCF + Entity Framework做了一个案例,该案例以图书馆图书管理、读者借书、还书为业务背景,以领域驱动设计为思想指导,全程采用Microsoft技术进行实践,希望能够给Microsoft技术的狂热者以及领域驱动设计的学者提供实践参考。本案例选用的业务逻辑非常简单,所以项目取名上我选用了“Tiny Library... 阅读全文
posted @ 2010-10-18 07:58 dax.net 阅读(13984) 评论(27) 推荐(8) 编辑