领域驱动设计案例:Tiny Library:业务逻辑与系统结构

之前我发布了领域驱动设计的一个实践案例:Tiny Library。本章介绍该案例实现的业务逻辑与系统结构设计。

 

业务逻辑

Tiny Library的业务逻辑非常简单,主要就是如下两条:

  1. 任何用户可以添加Library中的图书(简化起见,图书不能修改也不能删除),也可以查看图书的详细信息
  2. 注册用户,也就是读者,可以借书、还书、查看自己借过的图书列表和借书信息

篇幅有限,我就不在此将案例的操作过程一一截图了,读者朋友们可以自己下载源代码,然后在Visual Studio 2010中编译运行。

 

系统结构

由于是领域驱动设计,本案例系统分层与传统分层略有不同。分为四层:展现层、应用服务层、领域层和基础结构层。展现层采用ASP.NET MVC框架实现;应用服务层则是一个WCF Service;领域层采用Entity Framework结合本人自己研发的Apworks Application Development Framework;基础结构层则为整个应用提供了IoC、Caching、Specifications、Repository等的具体实现。整个系统架构基本上可以以下图描述:

image 

需要说明的是,在上图中的Domain Model和EdmRepository之间出现了双向依赖,于是我在边上用黄色注释文字作了注解。其实,Domain Model只依赖于仓储(Repository)的接口,而EdmRepository是基于Entity Framework的一种仓储实现方式,它实现IRepository接口,同时也对Domain Model产生依赖,以获得对聚合根的访问。关键的一步在于,Tiny Library采用依赖注入,将EdmRepository注射到Domain Model中,于是,Domain Model根本不依赖于仓储的具体实现方式,保证了领域模型层面的纯净度。领域驱动设计的社区中有很多朋友都对这个问题产生疑问,Tiny Library就是一个回答该问题的很好的案例。

 

Visual Studio 2010解决方案结构

Tiny Library在Microsoft Visual Studio 2010的解决方案下包含六个项目:TinyLibrary.Design、TinyLibrary.Domain、TinyLibrary.Repositories、TinyLibrary.Services、TinyLibrary.WebApp以及TinyLibrary.WebApp.Tests。如下所示:

image

  1. TinyLibrary.Design:项目的一些设计图稿,其中包括上面的架构图。一般没什么用(注意:第一个版本的Tiny Library解决方案中不包含这个项目,不过没关系,不影响大家的阅读和学习)
  2. TinyLibrary.Domain:领域模型项目,其中包括了Tiny Library的领域模型与业务逻辑,也是本案例的核心所在。为了能够以可视化的方式设计领域模型,也是为了采用Microsoft技术来实现案例,本项目采用了Microsoft Entity Framework作为建模工具
  3. TinyLibrary.Repositories:仓储的具体实现项目,它引用TinyLibrary.Domain项目,同时引用Apworks组件以实现IRepository接口。本项目仅包含了针对Entity Framework的仓储实现,同时也一并实现了Repository Transaction Context对象
  4. TinyLibrary.Services:WCF Application Service项目,它占用3722端口,其目的是与Presentation层交互。交互采用Data Transferring Objects(DTO),实现上是一组位于DataObjects目录下的Data Contracts。从这个项目可以看到,DTO与Entity/AggregateRoot并非是一一对应的,虽说在Tiny Library中,看上去是一个Entity/AggregateRoot对应一个Data Object,但仔细阅读可以发现,这些Data Objects中包含的数据跟与之对应的Entity/AggregateRoot中包含的对象状态是有出入的。这是根据应用程序的需求来决定的
  5. TinyLibrary.WebApp:本案例的主程序:一个ASP.NET Web应用程序,以ASP.NET MVC框架为基础,提供用户界面与交互接口
  6. TinyLibrary.WebApp.Tests:TinyLibrary.WebApp项目的单体测试项目,在本案例中,它是创建ASP.NET MVC项目时自动生成的,我没有去写或者修改任何Test Case,所以,可以直接无视这个项目

 

从下一讲开始,我将详细介绍Tiny Library的实现过程。这个过程不会是一步步的手把手教如何创建项目、如何编码等,而是对领域驱动设计在Microsoft .NET技术下的实践进行介绍。这些内容将包括:领域模型的实现、仓储的设计与实现、WCF Service与DTO、ASP.NET MVC的整合、领域驱动设计案例答疑以及Apworks Application Development Framework简介等。敬请期待!

posted @ 2010-10-20 08:13  dax.net  阅读(9524)  评论(20编辑  收藏  举报