标签:
先贴一下Conference案例的在线地址,UI因为完全拿了微软的实现,所以都是英文的,以后我有空再改为中文的。
前一篇文章介绍了Conference案例的上下文划分和领域模型的设计思路,本文想介绍一下Conference案例的架构设计。我做Conference案例的出发点是为了给大家展示如何使用ENode框架来开发DDD+CQRS+ES+EDA风格的应用程序。所以,Conference案例的架构自然就是使用这个架构了。下面我展开来说一下:
也许有人没看过ENode架构图,呵呵。我这里再贴一下,谁如果要进一步了解ENode的架构设计,可以看我博客中的其他关于ENode框架的介绍文章。
|
前篇文章中我们了解到,Conference案例共有三个上下文,分别是:会议管理(ConferenceManagement)、订单处理(Registration)、订单支付(Payment)。关于这个案例,微软的实现和我的实现有所不同,但上下文的划分是一致的。微软的实现中,三个上下文用的技术架构是不同的。
上面我简要分析了一下微软的实现。我觉得微软的实现还是非常有参考价值的,因为它充分展示了DDD中不同的BC可以采用不同的技术架构实现,然后通过EDA的整体架构,来实现3个BC之间的数据交互。非常棒。 下面我说一下ENode实现的Conference案例。 前面说过,本案例主要是为了展示ENode框架的使用,所以我给这3个BC都是使用ENode框架实现,所以每个BC都是采用的DDD+CQRS+ES的技术架构。由于有ENode框架的支持,所以代码实现还不算复杂,可以让开发只需要专注于业务逻辑的实现即可,不需要关心消息传递,消息不丢失,消息幂等处理,并发问题,C端数据持久化等技术问题。这些技术问题如果没有框架支持,要由应用开发人员自己实现,是很有难度的。通过这个案例实践下来,基本可以证明ENode框架是可以被使用来开发出一个可实际使用的项目的,这点我目前很有信心。 采用ENode框架开发一个BC的实现的时候,我们一般需要定义以下的一些工程:
另外,上面介绍了单个BC内部可能出现的项目,这些项目是我通过做这个案例后总结出来的觉得可以给开发者做参考的相互划分方式。大家如果觉得这样的方式不好,可以自己决定如何划分。通过上面的划分,我们的顶层Web项目只需要依赖简单的Commands,ReadModel这两个项目,就可以实现命令的发送和读库数据的查询了。而BC之间的交互,另一个BC只需要依赖当前BC的Messages项目就行,做到了最小的依赖。 最后介绍一下剩余的几个顶层项目: Conference案例有两个Web项目,分别为用户提供Conference的后台管理和前台订单预定的Web界面。这个不需要多解释了应该。然后,还有3个ProcessorHost项目。这3个项目分别是3个BC负责处理后台业务逻辑的顶层宿主项目。它们只需要用控制台应用或者Windows服务的方式启动即可(案例里的实现同时支持这两种方式的启动,会自动识别当前的应用程序类型)。这3个后台服务,它们都是从EQueue订阅消息,然后处理消息的方式,实现自己的功能。所以它们的唯一数据来源就是EQueue。那EQueue消息队列的服务端是哪个呢?就是最下面的MessageBroker,这个项目承载了整个系统的消息中心,也就是EQueue的Broker。所有的消息都会发送给MessageBroker,然后相关的ProcessorHost订阅相关的Topic,实现消息的消费。 |
下一篇文章打算从代码的角度,以创建一个会议为例,从前台Controller到最后更新读库的整个代码链路简单介绍一下,方便读者能对实现某个功能要写哪些代码先有一个清晰总体的认识。
ENode框架Conference案例分析系列之 - 架构设计
标签:
原文地址:http://www.cnblogs.com/netfocus/p/4597155.html