长安网站设计,唐山市住房和城乡建设局门户网站,网站网站娱乐建设,石家庄网络营销广告策划1. 引言
Module#xff0c;即模块#xff0c;是指提供特定功能的相对独立的单元。提到模块#xff0c;你肯定就会想到模块化设计思想#xff0c;也就是功能的分解和组合。对于简单问题#xff0c;可以直接构建单一模块的程序。而对于复杂问题#xff0c;则可以先创建若干…1. 引言
Module即模块是指提供特定功能的相对独立的单元。提到模块你肯定就会想到模块化设计思想也就是功能的分解和组合。对于简单问题可以直接构建单一模块的程序。而对于复杂问题则可以先创建若干个较小的模块然后将它们组装、链接在一起从而构成复杂的软件系统。
在DDD中模块的用途也是如此通过分解领域模型为不同的模块以降低领域模型的复杂性提高领域模型的可读性。
2. DDD中的模块
模块是一个笼统的概念比较宽泛为了正确发挥模块的威力理解模块的概念就十分重要。下面我们从具体的问题着手来尝试说明模块的概念。 如何对在线商城的顾客进行建模 对于顾客来说一般需要维护顾客的个人信息、收货地址、支付方式。这些信息是紧密相关的不可独立存在。我们可以抽象出三个简单的聚合Customer、AddressBook和 Wallet。那这些类该如何存放呢是为每一个聚合创建一个文件夹存放还是放在同一个文件夹我想答案不言而喻。这三个聚合就是一个模块一个客户模块。通过定义一个Customer文件夹来将相关联的领域对象组合起来。而这个文件夹体现在C#中就是命名空间的概念。 再来看一个问题如何设计在线商城的支付功能 支付是在线商城中十分重要的一个环节设计的好坏直接影响项目的成败。一般来说针对于支付环节我们应该单独放到支付子域中去处理以维护领域的不变性支付环节对应支付上下文在支付上下文下一些领域概念才能更清晰。为了提升支付体验我们势必要支持多种支付方式比如支付宝支付、微信支付、其他银行卡支付。在对接某一种支付方式时我们就应该为其定义单独的模块保证支付方式的独立性。同样我们可以选择通过命名空间来实现模块化也可以类似NopCommerce创建单独的项目来插件化开发集成每一种支付方式。同样我们也可以将整个支付功能拧出一个单独的支付模块以便在其他项目中进行共用。 如何集成第三方SDK? 我们知道开源的一大好处是大牛们分享了一系列高效、实用库或软件也就是大家常说的“轮子”比如Hangfire、RabbitMQ、Dapper、Redis等等我们可以直接开箱即用。但如果项目中集成很多的第三方SDK如果不加以组织整理项目的结构就会比较混乱代码的可读性就大大降低。这个时候我们就可以考虑模块化的去集成第三方SDK通过对第三方SDK的再封装来完善代码的组织结构以达到项目中的统一调用。Abp框架就是通过这种方式来集成比较流行第三方SDK。 通过以上的举例说明我们可以看到模块可大可小每个模块都是相对独立的功能单元。在C中我们可以用命名空间或单独的项目来实现模块。通过模块来组织和封装相关概念来分解领域模型以简化领域模型的复杂性。
但不要将模块与子域和限界上下文混淆。在复杂的领域模型中为了对领域模型中进行准确建模需要将领域模型拆分成多个子域每个子域对应一个或多个限界上下文。在限界上下文中可以将限界上下文中具体的领域概念分解成不同的模块。所以从子域到限界上下文再到模块应该是依次包含关系。
3. 模块设计的原则
模块的设计是基于领域模型的要符合通用语言的表述。其次模块的设计要符合高内聚低耦合的设计思想。
3.1. 根据领域来组织模块
模块应该由领域的概念来组织而不是根据通用的组件类型和模式来创建模块。如果将所有的聚合、服务、工厂分别放在独立的模块中就会有悖于DDD的设计原则同时还会限制我们创建富有行为的领域模型。这样设计的模块的关注点是在当前的组件和模式上而不是在领域上。每个模块都应该有适当的类来建模领域的特定方面的概念和功能。
3.2. 基于通用语言
项目中的通用语言除了用来指导实体值对象、领域服务和领域事件的的命名外也适用于模块的命名。使用通用语言来为模块命名可以清晰的反映领域中的概念且能够明确模块职责。例如领域中身份认证的概念我们就可以以Identity来命名这个模块。
推荐的模块命名规范是公司名称.项目名称.架构分层.限界上下文.组件类型。比如对腾讯微信产品的朋友圈模块的领域层可以按以下方式命名
Tencent.Weixin.Domain.Moment.Models Tencent.Weixin.Domain.Moment.RepositoriesTencent.Weixin.Domain.Moment.ServicesTencent.Weixin.Domain.Moment.Factories
说到这里你可能会想到mvc的项目结构也是基于模块的思想比如Models、Views、Controllers、css、js都是放在独立的文件夹中这其实也是关注点分离的思想通过模块的分割来达到关注点分离。
3.3. 高内聚低耦合
高内聚低耦合是模块设计的重要思想模块内高内聚模块间低耦合。一个完整的系统模块与模块之间尽可能的使其独立存在。也就是说让每个模块尽可能的独立完成某个特定的子功能。模块与模块之间的接口尽量的少而简单。如果某两个模块间的关系比较复杂的话最好首先考虑进一步的模块划分这样有利于修改和组合。
4. 总结
模块是对领域模型进行分解后的产物是相对独立的功能单元由一系列高内聚的领域对象组成相对聚合、实体和值对象来说是更高一层的抽象。
模块化的思想大大简化了领域模型的复杂性即便于我们设计出高内聚低耦合的系统也便于我们理解系统的设计。
而至于模块的实现我们既可以通过命名空间来进行分离也可以使用单独的项目来实现。
参考资料
What are Modules in Domain Driven Design?
相关文章
DDD理论学习系列1-- 通用语言DDD领域驱动之干货 一DDD理论学习系列2-- 领域DDD理论学习系列3-- 限界上下文DDD理论学习系列4-- 领域模型事件总线知多少2DDD理论学习系列5-- 统一建模语言DDD理论学习系列6-- 实体DDD理论学习系列7-- 值对象DDD理论学习系列8-- 应用服务领域服务DDD理论学习系列9-- 领域事件DDD理论学习系列10-- 聚合DDD理论学习系列11-- 工厂DDD理论学习系列12-- 仓储从事件和DDD入手来构建微服务DDD领域驱动之干货 一WeText项目一个基于.NET实现的DDD、CQRS与微服务架构的演示案例【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端基于.NET CORE微服务框架 -surging的介绍和简单示例 开源剥析surging的架构思想基于.NET CORE微服务框架 -谈谈surging的服务容错降级我眼中的ASP.NET Core之微服务.NET Core 事件总线,分布式事务解决方案CAP
原文地址http://www.cnblogs.com/sheng-jie/p/7266557.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注