Microsoft NLayerApp案例理论与实践【DDD、分布式DDD及其分层】

时间:2014-01-29 16:08:15   收藏:0   阅读:585

这段时间一直在忙工作,已经有一个月没更新博客了。从现在开始,我将继续讨论Microsoft NLayerApp案例,希望各位爱好Microsoft NLayerApp案例、架构设计以及DDD的朋友们能够继续关注。

从架构上看,Microsoft NLayerApp对“复杂的业务系统应用程序”这样一种应用程序的架构设计提供了一系列的设计准则。所谓“复杂的业务系统应用程序”是指这样一类业务系统应用程序,这类应用程序具有相对较长的生命周期,在其生命周期中,将发生一些可预期的“革命性变更”(比如,所使用的技术/框架的版本升级甚至替换),因此后期维护会变得非常重要。于是,针对这种类型应用程序的设计,我们应该做到,当“革命性变更”来临时,将这种变更对应用程序其他部分的影响减少到最小程度,例如,我们要确保基于基础结构层的设施变更不会影响到其上层的各个部分。更确切地说,应用程序的领域模型部分应该只关注领域本身,变更应用程序的其它部分,不会影响到领域模型。在“复杂的业务系统应用程序”中,业务规则的行为方式(也就是“领域逻辑”)将会是经常变化的,因此,使其具有很好的可修改性和可测试性将会非常重要。要达到这样的效果,就需要实现领域模型部分与系统其它部分的解耦。作为领域驱动设计(DDD)的一部分的面向领域的多层分布式架构,关注的就是这样的问题。

还是那句话,DDD不仅仅只是架构+模式。DDD是开发应用程序的一种方式,是团队在项目中工作的一种方式。根据DDD,项目团队需要以一种特殊的方式进行合作,应该能够直接与领域专家(通常就是客户)进行沟通。整个团队需要使用“通用语言”这一能够被所有人接受的语言,等等。然而,本案例没有包含这些内容,因为这是一种“过程”,一种ALM。所以,如果你真的希望100%实践DDD,你需要阅读Eric Evans写的《领域驱动设计-软件核心复杂性应对之道》一书,或者其它的一些讨论DDD过程的书籍,这些书籍会对DDD过程、项目和团队做比较详细的介绍,而不仅仅是谈论架构和模式。架构和模式仅仅是DDD中很小的一部分,而我们在这里展示的就恰好是这一部分。总之,我们必须强调,DDD不仅仅是架构+模式。

在社区中,不少朋友觉得DDD风格的架构模式(经典的也好,CQRS也好)在实际项目的应用与推广中存在一定的问题,比如从老系统向新系统的过渡过程中,DDD风格架构很难找到切入点,再比如,基于CQRS架构的应用系统难度较大,复杂度高,普通的开发人员很难在短期内掌握相关知识,一旦出现团队人员流动,新加入的团队成员将在短期内无法胜任开发职位,对项目本身造成影响。不少朋友都在关注领域驱动设计以及CQRS架构,或许也从我的博客系列文章中受到了启发,于是希望能够在实际工作和项目中能够应用DDD的理念和技术进行开发,但却在应用的过程中遇到了重重阻碍,最后不得不放弃。对于我来说,我专注于.NET技术以及DDD,我只不过是一直在探索某一种类型的应用程序的架构方式,并试图将这种设计思想和架构风格展示给大家。注意这里“某一种”的措辞,DDD风格架构并不适用于所有的实际项目和应用系统,就软件团队本身而言,推行DDD的开发过程也非一朝一夕之事。架构师们需要对项目实际情况进行分析,这包括应用系统的架构本身,以及团队建设的各方面因素(比如,团队是否能够首先引入Agile开发过程,进而去适应DDD的开发模式,等等)。DDD过程以及DDD风格的架构模式只不过是摆在您面前的又一个选项。接下来的介绍或许能够帮助您更准确地做出抉择。

不选用面向领域的多层分布式架构(DDD风格架构)的理由

如果应用程序相对简单,而且在其生命周期的整个过程中,基础结构所使用的技术和框架以及业务逻辑层等各方面都不会有太大的变更,那么你就不需要选用基于DDD的多层分布式架构。你可以选择一些RAD(Rapid Application Development)的技术,比如WCF RIA Services或者Visual Studio Lightswitch等,它能使得开发简单的应用程序变得非常高效。这些简单的应用程序关注的是Time to Market(TTM),而对于合理的结构、分层解耦等概念却并不是很关注。通常,我们把这样的应用程序成为“数据驱动的应用程序”。

选用面向领域的多层分布式架构(DDD风格架构)的理由

如果你希望你的应用程序在较长的一段时间内都能够适应业务逻辑的变化,那么,强烈建议你选用面向领域的多层分布式架构。在这种情况下,领域模型将降低由业务逻辑变化而引起的高额代价,组件之间、层与层之间低耦合的结构,使得在每次出现业务逻辑变更的时候,你都能够将领域模型隔离出来进行调整和测试,而不需要更改应用程序的其它部分,这样有效地降低了需求变更带来的开发风险,并节省了项目开支。

分布式DDD(Distributed DDD, DDDD)

这个概念是Microsoft NLayerApp在其Guide Book中提及的,就是在DDD风格架构的基础上,将分布式的特性包含进来。在Eric Evans的《领域驱动设计-软件核心复杂性应对之道》一书中,他并没有提及太多的有关分布式技术的内容(比如Web Service技术等),主要也是因为针对DDD的讨论本身也是立足于Domain的。然而,在实际的应用程序实现和部署过程中,分布式技术是必不可少的。事实上,Microsoft NLayerApp是面向分布式DDD的,在实现“分布式”的过程中,采用了微软特有的技术,比如WCF等。DDDD也使得应用程序能够更好地适应分布式场景,甚至可以使应用程序更方便地部署到云计算的环境中。

面向领域的多层架构

早在《EntityFramework之领域驱动设计实践 (二):分层架构》一文中,我就对基于DDD风格的分层架构做了介绍。现在回顾一下,DDD风格架构主要分为四层:表现层、应用层、领域层和基础结构层:

bubuko.com,布布扣

现在让我们来对比一下Microsoft NLayerApp的架构分层方式。在Microsoft NLayerApp的Guide Book中提供了下面的分层架构图,其分层方式在大体上与上文所述基本相同,同时,下图还对各个层的内部做了细化描述,便于读者能够更清楚地了解到每个层所包含的组件及其之间的协作方式。

bubuko.com,布布扣

了解整个项目的整体架构对于理解整个系统的运作方式有着很大的帮助。下面,我将对上述架构中的每个层进行介绍,让我们看看这些层都包含了哪些组件,以及这些组件是如何协作的。

总结

本文以文字描述为主,结合Microsoft NLayerApp项目,更详细地对DDD及其分层架构做了介绍,文中也引入了不少来自于Martin Fowler《企业应用架构模式(PoEAA)》一书中所介绍的概念与模式名称,帮助读者朋友更好地理解DDD分层架构中各层的主要职责。与Microsoft NLayerApp案例理论与实践 - 多层架构与应用系统设计原则一文一起,通过这两篇文章的学习,我们已经对应用程序的设计与架构,以及DDD风格架构及其分层有了一定的了解。从下章节开始,我们会把本文所描述的分层架构与Microsoft NLayerApp项目结合起来,进一步学习Microsoft NLayerApp项目的具体实现。

原文:http://blog.csdn.net/zhixiang2010/article/details/18860153

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!