速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论

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

人才短缺、成本高昂,制造企业智能化转型路径如何破局?

百度大脑

Go语言图书管理RESTful API开发实战

Jackpop

Kubernetes核心组件-ETCD详解

巨子嘉

容器 云原生 etcd

外包学生管理系统架构设计

唐尤华

架构实战营

DG-IoT工业数据云平台

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

Lyft微服务研发效能提升实践 | 1. 开发和测试环境的历史

俞凡

研发效能 大厂实践 2月月更 lyft

PaddleDTX v1.0版本发布,安全性灵活性全面提升!

百度大脑

PingCode与Jira 敏捷开发管理能力的对比

爱吃小舅的鱼

敏捷宣言及完整解读

爱吃小舅的鱼

Windows怎么就突然不好用了?

Jackpop

基于STM32设计的环境检测设备

DS小龙哥

2月月更 STM32环境检测仪

聊聊 Kafka:Topic 创建流程与源码分析 | 社区征文

老周聊架构

云原生 Apache Pulsar 新春征文 2月月更

【网络安全应急响应】实战思路经验分享

H

网络安全 应急响应

毕业设计

Geek_e6f7f6

架构实战营

作业八-消息队列数据库建模

曾竞超

架构实战营 「架构实战营」

大模型应用新范式:统一特征表示优化(UFO)

百度大脑

外包学生管理系统的架构文档

王大胖

跨平台应用开发进阶 (四) :uni-app 实现图片上传、预览、删除、压缩

No Silver Bullet

uni-app 跨平台 图片 2月月更

2022年的元宇宙:抢人、烧钱、突破体验边界

CECBC

用Weave Net 打开跨主机容器互联大门 | 社区征文

L同学

docker网络 新春征文 网络交换机 weave 集群网络

【C语言】初始字符串 & 转义字符与注释

謓泽

C语言 2月月更

浅谈人工智能发展六大趋势 | 社区征文

战场小包

人工智能 新春征文 2月月更

从冬奥看中国科技(五):漫天塞地物联网

脑极体

如何打造一款得心应手的VS Code?

Jackpop

如何利用区块链改进金融系统身份验证?

CECBC

阿里稳定性指标1-5-10解读

焦振清

稳定性 1-5-10 MTTR

总算彻底搞懂Python集合了

Jackpop

The Rust Programming Language

Joseph295

敏捷开发框架都有哪些

爱吃小舅的鱼

零基础想学习Web安全,如何入门?

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞

办公效率起飞了!Python终于解放了我的双手

Jackpop

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