写点什么

使用领域驱动设计中的 Bounded Context 概念分解大领域模型

  • 2013-03-04
  • 本文字数:1077 字

    阅读完需:约 4 分钟

Juelie Lerman 近期在 MSDN 杂志中解释说,开发者可以应用领域驱动设计(DDD)中的Bounded Context 概念将一个大模型分解为几个较小的模型,每一个模型对应 Entity Framework (EF)中的 Database Context(DbContext 类)。

按照 Julie(她从 2003 年以来就是 Microsoft MVP ,也是一位.NET 平台的顾问及导师)的说法,把一个将大量的类放在一个上下文中的独立模型分解为多个较小的模型是有好处的。Bounded Context 创建的模型较小,而且内聚性更高,同时维持了模型之间的边界,Julie 的文章就是基于这一事实的。但她也指出,比起使用 EF DbContext,DDD 中的 Bounded Context 是一个更大的概念,因此她称自己的实现方式为“受限的”或“专注的”DbContext。

通过分离属于不同上下文的类(例如:将针对顾客的类和针对订单及配送的类分离,并把这些类放入独立的 DbContext 中),Julie 将一个包含了整个应用程序所有类的大型上下文分解为更小而且更专注的上下文,而在其下运行的大型数据模型及数据库表依然不变。
如果在某个上下文中,某个类的所有属性并非全部必需,那就可以创建一个更小而且更专注的类,它涵盖了原始类的某些部分,并间接地涵盖了底层数据库表的某些部分 [z2] ,这是通过在数据库中使用视图来实现的。使用这些类的一个限制是:如果有某些不允许为空的表字段不在这些类的控制之下,那就不能够使用这些类完成数据库的插入操作,否则在进行插入操作时,DbContext 会抛出异常。

使用“Code First”,以自动生成所有数据库表的方式创建数据库需要更多工作,包括需要一个独立的“全局模型(über-model)”,以及一个包含所有类的 DbContext,这个完整的 DbContext 将用于初始化数据库。

对于以这种方式应用 Bounded Context 的做法, DDD 原书的作者 Eric Evans 在一条推特中给出了正面的反馈,不过也有人心存疑虑并给出了备选方案。有反馈意见认为这种做法违背了Bounded Context 的概念,并援引了DDD 社区的定义

“应该[z3] 显式地定义某个模型所应用的上下文。还应该在团队组织、应用中特定部分的使用以及像代码库和数据库模式等物理表现等方面显式地设定边界。要保持边界中模型的严格一致,而不要受外界问题的影响与干扰。”

Entity Framework 是 Microsoft 在.NET 平台上推出的对象关系映射工具

查看英文原文: Using the Domain Driven Design Bounded Context Concept to Shrink a Large Domain Model


感谢臧秀涛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-03-04 06:414860
用户头像

发布了 428 篇内容, 共 176.7 次阅读, 收获喜欢 38 次。

关注

评论

发布
暂无评论
发现更多内容

IE 退出后,苹果 Safari 成为了开发者最讨厌的浏览器?

百度开发者中心

产品 最佳实践 开发者 方法论 浏览器

学了阿里P8级架构师的7+1+1落地项目,万字长文!

Java 程序员 后端

字节三面+微信四面+PayPal四面,大厂面经分享

Java 程序员 架构 面试 计算机

DBA:这有一份对接NBU备份故障排除指南,请查收!

华为云开发者联盟

故障 DWS 备份 NBU NetBackup

开发者进阶宝典,HarmonyOS 职业认证全奉上

科技汇

Nginx 内存池似懂非懂?一文带你看清高性能服务器内存池

Linux服务器开发

nginx Linux服务器开发 Linux后台开发 高性能服务器 内存池

高防云服务器与云服务器的区别以及如何去更好的选择?

九河云安全

多数元素

Memorys

Java 面试 算法

jackson1处理特殊字符有什么问题?

BUG侦探

json Java 开发 jackson特殊字符

勒索软件、网络钓鱼、零信任和网络安全的新常态

九河云安全

实战SpringCloud通用请求字段拦截处理,成功入职腾讯

Java 程序员 后端

模块九毕设

c

架构实战营

Apache ShardingSphere:由开源驱动的分布式数据库中间件生态

SphereEx

数据库 开源

学会这十招,轻松搜索github优质项目

Java架构师迁哥

宅家36天咸鱼翻身入职腾讯,看完这一篇就够了!

Java 程序员 后端

Vue进阶(幺柒贰):应用 @fullcalendar/vue 实现日程日历

No Silver Bullet

Vue 8月日更 Fullcalendar

PostgreSQL如何查找某一事务中的完整SQL

Qunar技术沙龙

sql postgresql 运维 dba

肝到头秃!阿里爆款的顶配版Spring Security笔记

Java spring 程序员 架构 计算机

书单 | 7月畅销新书情报,看谁是最大黑马

博文视点Broadview

通过EasyRecovery如何恢复被永久删除的音频?

淋雨

EasyRecovery 文件恢复 硬盘数据恢复

Apache APISIX 在移动云的应用

API7.ai 技术团队

开源 APISIX

已获千赞,进阶学习资料!

Java 程序员 后端

学习Java开发的步骤,先睹为快

Java 程序员 后端

Linux-Vim 编辑器和恢复 ext4 下误删除文件-Xmanager 工具

学神来啦

vim Linux 学习 运维

香港云服务器的运行原理以及是微小创业公司的最具性价比的选择

九河云安全

刘擎:如何在迷失中找到自我?

石云升

哲学 自我 8月日更

架构实战训练营存储架构设计

Clarke

Vue进阶(幺玖肆):VantUI 实现 Dialog 弹框动态显示 message

No Silver Bullet

Vue eCharts 8月日更

基于ECS搭建FTP服务

若尘

阿里云 ftp服务 8月日更

阿里云 Centos7安装ssh+nginx+mysql 傻瓜式教程

九河云安全

课余时间学点python(一)Python基础之了解,下载,使用

ベ布小禅

8月日更

使用领域驱动设计中的Bounded Context概念分解大领域模型_语言 & 开发_Jan Stenberg_InfoQ精选文章