写点什么

使用领域驱动设计中的 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:415399
用户头像

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

关注

评论

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

自助手动洗车设备洗车怎么样?

共享电单车厂家

自助洗车加盟 自助洗车机洗车 自助手动洗车设备

PingCAP Clinic 服务:贯穿云上云下的 TiDB 集群诊断服务

PingCAP

从流量交换到共享联盟,开放银行如何助力金融数字转型?

CECBC

YARN Federation技术解析及应用

移动云大数据

YARN

小区适合投放自助洗车机吗?

共享电单车厂家

自助洗车加盟 小区投放自助洗车机

平衡人工智能的性能要求,实现可信AI在银行业务场景的高质量应用

易观分析

人工智能

Fastjson官方再次披露高危漏洞,包括rocketmq、jeecg-boot等近15%的github开源项目受影响

墨菲安全

安全 idea插件 Fastjson 依赖漏洞检测 墨菲安全

企业的文档管理策略

小炮

文档管理

7 款最棒的开源 React UI 库测评 - 特别针对国内使用场景推荐

蒋川

JavaScript react.js 开源 UI 组件库

固定资产投资管理系统解决方案

低代码小观

资产管理 CRM系统 客户关系管理系统 企业设备管理 设备巡检管理系统

MBTI 剧透人生,你的天选职业是什么?(免费测)

融云 RongCloud

网页在线帮助中心的搭建策略

小炮

帮助中心

fastposter v2.8.2 发布 电商海报生成器

物有本末

智能汽车领域的开源软件供应链安全检测工具分享

墨菲安全

idea插件 工具分享 开源安全 墨菲安全 软件供应链

避免惊群以及负载均衡的原理与具体实现

C++后台开发

nginx 负载均衡 后端开发 C++后台开发 惊群

6月月更“粽”头戏,大家一起来参与吧!

InfoQ写作社区官方

热门活动 6月月更

十一、云原生网络微隔离

穿过生命散发芬芳

5月月更 微隔离

以区块链技术推进应急管理体系现代化

CECBC

重磅首发!火线安全发布《云安全攻防技术期刊》

火线安全

安全 云安全

「v2.4」千呼万唤的图形化编排,来了!

Jianmu

持续集成 低代码 开发工具 开源项目 节点编排

为什么穷人越穷,富人越富?

大数据梦想家

程序人生

2021年证券类APP更新迭代监测专题分析(中)发布

易观分析

证券

没有店面店铺可以做自助洗车吗?

共享电单车厂家

自助洗车加盟 自助洗车店面

百度智能小程序巡检调度方案演进之路

百度Geek说

高危!Fastjson反序列化远程代码执行漏洞风险通告,请尽快升级

葡萄城技术团队

json 安全 Fastjson

模块二

Geek_2ce415

TiDB 查询优化及调优系列(四)查询执行计划的调整及优化原理

PingCAP

uniapp 如何将输入值转成大写

CRMEB

英特尔开源项目推动SYCL标准采用,打破单个厂商封闭生态系统

科技之家

如何用Apifox 发送接口请求?

Liam

开发者 测试 后端 开发 Postman

是开自助洗车店还是传统洗车店好?

共享电单车厂家

自助洗车加盟 开自助洗车店 传统洗车店

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