如何表示有界的上下文?

时间:2011-01-01 22:37:03

标签: c# domain-driven-design bounded-contexts

我的意思是 - 在物理上,在代码中。组织命名,命名空间,文件夹,程序集,数据库。

有限的上下文应该如何互动?

例如,您可以随意使用经典e-commerce business domain

2 个答案:

答案 0 :(得分:12)

我会说'这取决于'

有时候将BC实体映射到同一个数据库可能就足够了,有时候你的BC可能有不同的数据库。

IMO,电子商务可能更像是一个BC而不是一个完整的域。

我在一个销售食品的销售代理商上花了太多时间。

所以域名是“整体销售”,有限的背景是,库存,购买,销售,发票,产品目录和电子商务(也许我在这里使用错误的英文措辞)

这些BC中的每一个都知道“产品”,但他们都对产品有不同的看法。

e.g。购买可能有一个产品实体,附有供应商信息,购买价格等。

虽然电子商务领域的产品将从客户的角度进行建模,但它会提供与客户相关的信息,其具体价格等。

电子商务BC将从多个来源获得其产品信息;产品目录和销售。 其中基本信息来自产品目录,客户特定价格来自销售。

因此,BC电子商务中的产品库可能会从其他BC(通过某种服务,在我的案例中很可能是web或wcf)进行上下文映射,以构建我们的电子商务产品实体。

我个人将其建模为单独的程序集,我会有一个电子商务模型和销售模型。

我的电子商务模式中的大多数信息都来自外部来源,并且不会在本地持久存在。 只有购物车才能在本地持久存在,因为这些对象归电子商务模式所有。

一旦客户尝试完成购买,我将从购物车构建预订,然后将其传递给销售BC。 通过直接服务呼叫或通过消息队列。

简而言之,我倾向于围绕特定的BC构建我的系统,并且只通过服务与其他BC进行交互。

我知道很多人确实将他们的BC放在相同的程序集中并使用来自同一个应用程序的多个BC。 但我发现奇怪为什么一个特定用途的应用程序应该知道多个上下文。 我宁愿只知道一个上下文,然后将我需要的任何数据传递给其他应用程序。

答案 1 :(得分:6)

我当然同意这一切都取决于,但有一些指导方针可以/应该遵循。有界上下文的目的是边界。通过引入明确定义的合同(接口)将应用程序的一部分与另一个分开的边界。

我倾向于将BCs视为SOA中的服务。对我而言,理想情况下它们是物理上独立的应用程序(OS进程/ IIS网站)。二进制当然也是分开的。 BC之间的所有通信都是理想的异步。在现实世界中,这几乎是不可能的,但至少我不允许跨BC交易,因为它们是纯粹的邪恶。

希望有所帮助。