在阅读了Eric Evans 的书Domain-Driven Design,Tackling Complexity in the Heart of Software之后,我设计软件系统的方式完全改变了。之前,我常常以一种侧重于数据为中心的方式设计软件对象模型,我没有真正聚焦于如何把行为和数据结合到对象中。我对这种新的思考方式感到如此震惊,因此我开始试图找到能够揭示Eric书中概念的代码示例。我通常用Google搜索我的领域驱动设计(DDD)问题的答案,并且通常确实发现有些东西对我有帮助,但我依然渴求更多关于这个主题的知识。 我不得不搜索.NET中的DDD答案,因为Eric的书中技术是不可知的。本书的要点是架构概念。里面到处有Java和Smalltalk的代码示例,但不是关于架构概念的。然后,就有了Jimmy Nilsson的书Applying Domain-Driven Design and Patterns,此时我开始看到可以用于连接DDD概念的更多模式。Jimmy把来自Martin Fowler的优秀书籍Patterns of Enterprise Application Architecture的一些概念结合起来,并说明它们如何有助于得到好的DDD设计原则。Jimmy也做了大量的工作,在他的书中提供了大量优秀的.NET代码示例,并引导读者体验了几种按照DDD实现操作的方法。就在我刚看完Jimmy的书后,我开始订阅Yahoo! Groups 上的DDD RSS Group feed,这也给了我很多帮助。在DDD小组中,我发现的一件事情是人们一直在寻找一个能够揭示DDD原则的.NET相关应用。在阅读了这些帖子之后,我决定撰写这本书,把我懂得的关于如何使用DDD技术构建.NET应用的知识分享给开发人员社群。我猜我可能感觉有点内疚,因为我读了小组里如此多其他人的帖子,但我只是偶尔发帖。现在,我编写了一本书代替发帖!可能这将促使我更多地融入这个小组。 我写这本书的主要目的是吸取Eric、Martin和Jimmy书中的思想和模式,构建一个真实的端到端.NET应用。我确实希望说明我如何使用DDD原则在.NET中构建一个领域模型的某些想法,但是,我并非只是构建老的.NET应用,我也要尝试一些Microsoft在构建应用方面的最新技术,如Visual Studio 2008和.NET 3.5框架。 本书面向的读者 本书针对希望精通面向对象的设计技巧和学习DDD的有经验的.NET 开发人员。如果您不在这个级别,也是可以的,但我建议您至少有一些编写.NET代码或者Java代码的经验。如果您之前没有编写过任何.NET代码,则本书可能稍微有点难。 我也推荐您阅读之前提到的Eric Evans、Jimmy Nilsson和Martin Fowler的书籍。您不一定要读,但我强烈推荐阅读,因为这有助于您更好地理解本书的许多设计和模式。 因为本书的每一章都建立在前一章的基础上,所以我建议您按顺序阅读。 本书涉及范围 第1章,“介绍项目:SmartCA系统”—— 本章介绍我正在构建的系统—— SmartCA系统。本章不仅列出了遗留系统的问题以及新系统的需求,而且说明了计划用来满足所有需求的技术和设计。 第2章,“设计分层架构”—— 本章涵盖了本书其余部分要使用的架构基础。本章介绍了一些模式,包括分层超类型模式、分离接口模式以及模型-视图-视图模型模式。我也标识和解释了几个重要的DDD概念。这是我开始编写系统的代码的第1章,重点放在基础设施层。 第3章,“管理项目”—— 本章开始实现系统中管理项目的功能。本章也讨论了承包商的概念以及他们与项目之间的关系,并介绍了模型-视图-视图模型模式的第一个代码迭代。 第4章,“公司和联系人”——本章定义和建模了公司、联系人和项目联系人。本章也说明了如何保存不是它们自己的聚合根实体,例如,在项目聚合内如何保存项目联系人。最后,介绍在UI显示和编辑值对象的技术。 第5章,“递交传送”—— 本章介绍了用在建筑行业中的递交传送的概念,然后使用该概念来建模递交聚合。我给领域层和基础设施层都添加了一个新概念,阐述了如何保存来自实体根仓储的子集合。本章也讨论了如何使用Xceed DataGrid Control来构建用户控件。 第6章,“信息请求”—— 本章介绍了建筑行业中信息请求(RFI)的概念。我也在领域中引入了一个新的模式,称为说明模式。本章也针对如何处理传送的仓储和视图模型做了一些重要的重构。 第7章,“提案请求”—— 本章介绍了建筑行业中提案请求的概念。本章开始给领域模型添加更多的行为,并说明更丰富的领域模型类。本章也讨论了如何处理领域模型类内部的违反业务规则,并绑定说明功能。 第8章,“更改单”—— 本章介绍了建筑行业中更改单的概念。本章继续给领域模型类添加更多的行为,继续开发更丰富的领域模型类。本章介绍了两个重要的接口,IEntity接口和IAggregateRoot接口。这导致遍及整个领域模型的大量好的重构。最后,本章创建了一些更加高级的规格类。 第9章,“施工更改指令”—— 本章介绍了建筑行业中施工更改指令的概念,并进行了大量重构,主要聚焦于各个视图模型类。本章说明了接口和泛型结合的功能。 第10章,“和服务器同步”—— 本章设计和实现了如何和服务器同步客户的离线数据。本章不仅介绍了如何在客户上存储事务消息,而且介绍了如何把这些客户上的消息和服务器上的消息同步。此外,还说明了如何确保在领域模型中实现所有的同步逻辑。 第11章,“客户会员管理系统”—— 本章创建了客户会员管理系统,从而说明了如何允许用户能够在一个离线场景中执行会员管理相关的任务。这涉及一个非常丰富的领域模型,用来表示用户及其会员管理数据,以及使用提供程序而不是仓储来和数据存储交互的新概念。本章也说明了如何利用第10章的同步代码。 本书结构 本书本质上是一个非常大的示例研究。通过这些章节,从头到尾构建了一个完整的系统。每一章的结构都是相同的,总体上是一个自包含的模块,由问题、设计和解决方案组成,解决方案为正在构建的系统添加了一些新的功能,最后在该章的末尾作了一个总结。 大多数时候,问题部分相当短,而设计部分和解决方案部分占了大部分篇幅。解决方案部分总是包含实现设计的代码。 本书环境 为了运行本书的所有代码示例,您需要安装Visual Studio 2008(安装时包括了.NET 3.5 Framework)。我强烈推荐您使用Visual Studio 2008 Professional Edition,这样可以运行作为代码基的一部分的所有单元测试。 另外,您需要安装以下应用程序和组件: ● SQL Server Compact 3.5 (SQL CE)—— 免费从Microsoft SQL Server Web站点下载。 ● Xceed DataGrid Control for WPF 1.3版本—— 免费从Xceed Web站点下载。 ● 某个版本的SQL Server 2008—— 如果您要使用SQL Server Management Studio来更改SQL CE数据库的话,则这是必需的。Express Edition可以免费从。 源代码 在读者学习本书中的示例时,可以手工输入所有的代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点/或www.tupwk.com.cn/downpage上下载。登录到站点/,使用Search工具或使用书名列表就可以找到本书。接着单击本书细目页面上的Download Code链接,就可以获得所有的源代码。 注释: 由于许多图书的标题都很类似,所以按ISBN搜索是最简单的,本书英文版的ISBN是978-0-470-14756-6。 在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以进入/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。 勘误表 尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。 请给wkservice@vip.163.com发电子邮件,我们就会检查您的反馈信息,如果是正确的,我们将在本书的后续版本中采用。 要在网站上找到本书英文版的勘误表,可以登录,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是/misc-pages/booklist.shtml。 要与作者和同行讨论,请加入上的P2P论坛。这个论坛是一个基于Web的系统,便于您张贴与Wrox图书相关的消息和相关技术,与其他读者和技术用户交流心得。该论坛提供了订阅功能,当论坛上有新的消息时,它可以给您传送感兴趣的论题。Wrox作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题。 在上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于开发自己的应用程序。要加入论坛,可以遵循下面的步骤: (1) 进入,单击Register链接。 (2) 阅读使用协议,并单击Agree按扭。 (3) 填写加入该论坛所需要的信息和自己希望提供的其他信息,单击Submit按扭。 (4) 您会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。 注释: 不加入P2P也可以阅读论坛上的消息,但要张贴自己的消息,就必须加入该论坛。 加入论坛后,就可以张贴新消息,响应其他用户张贴的消息。可以随时在Web上阅读消息。如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边的Subscribe to this Forum图标。 关于使用Wrox P2P的更多信息,可阅读P2P FAQ,了解论坛软件的工作情况以及P2P和Wrox图书的许多常见问题。要阅读FAQ,可以在任意P2P页面上单击FAQ链接。