产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

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

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

关注

评论

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

基于微信小程序的竞赛答题小程序开发笔记(一)

CC同学

2个比较经典的PHP加密解密函数分享

百度搜索:蓝易云

丽江等级保护测评机构有几家?在哪里?

行云管家

等保 丽江 等保测评

Cisco Jabber 15.0 发布下载 - 面向企业的多合一通信工具

sysin

Cisco 通信 思科 即时消息

DBeaverEE:专业级数据库管理工具,让数据管理更高效

Rose

使用 fabric.js 开发移动端 H5 图片编辑器细节

秦少卫

Fabric.js 图片编辑器 开源图片编辑器 开源vue图片编辑器 vue图片编辑器

Cellebrite UFED 4PC 7.70 下载 - Android 和 iOS 移动设备取证软件

sysin

ios android UFED 移动取证 手机取证

DApp开发入门指南:从概念到实践!DApp开发流程+DApp 经济模型

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

研究揭秘生成式AI惊人耗水量!训练1个模型相当于165人1年总用水量!武汉大学首个人形机器人“天问”|AI日报

可信AI进展

高并发设计之细粒度锁 : 5种细粒度锁的设计技巧图解(高并发篇)

肖哥弹架构

Java 乐观锁 悲观锁 高并发

MongoDB 双活集群在运营商的实践

tapdata

数据库

机构加仓生态良好 比特币牛市延续有戏

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

Nginx配置最全详解(万字图文总结)

江南一点雨

Linux JAVA环境的搭建tomcat的部署

百度搜索:蓝易云

Web3 星探 a16z 新加速器启动,盘点入围的「未来之星」

TechubNews

信创里程碑:TapData 与海量数据达成产品兼容互认证,共同助力基础设施国产化建设

tapdata

数据库

堡垒机啥意思?怎么简单理解?

行云管家

网络安全 堡垒机

2024开放原子开源生态大会 | 双轮驱动,开源生态建设从“幼苗”成长为“大树”

Geek_2d6073

macOS Sonoma 14.7 (23H124) Boot ISO 原版可引导镜像下载

sysin

macos ISO Sonoma

NFTScan | 09.16~09.23 NFT 市场热点汇总

NFT Research

NFT\ NFTScan

无代码/低代码平台集成能力深度分析

NocoBase

低代码 无代码 集成能力

详解sudo usermod -aG docker majn

百度搜索:蓝易云

Revolutionizing Long-Range Wi-Fi: How IPQ5010 Series Tackles Point-to-Point Transfer Challenges!

wallyslilly

ipq5018 IPQ5010 ipq9574

快速生成应用:AI大模型与低代码平台如何无缝结合提升效率?

天津汇柏科技有限公司

低代码 AI 人工智能

NIFI使用InvokeHTTP发送http请求

百度搜索:蓝易云

抖音商品SKU数据接口深度解析:解锁Dy.item_sku的电商新纪元

代码忍者

API 测试 pinduoduo API

【解决方案】Java 互联网项目中常见的 Redis 缓存应用场景

EquatorCoco

Java redis 缓存

VMware Tanzu Kubernetes Grid 2.5.2 发布下载,新增功能概览

sysin

Kubernetes 云原生 vmware Tanzu

php的html实体和字符之间的转换

百度搜索:蓝易云

资深ETL工程师经验分享:ETL项目的5大挑战与策略

RestCloud

数据处理 ETL 数据集成 集成工具

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