Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对存在于所有有界上下文中且是应用程序核心部分的实体进行建模?_C#_Design Patterns_Domain Driven Design_Cqrs_Bounded Contexts - Fatal编程技术网

C# 如何对存在于所有有界上下文中且是应用程序核心部分的实体进行建模?

C# 如何对存在于所有有界上下文中且是应用程序核心部分的实体进行建模?,c#,design-patterns,domain-driven-design,cqrs,bounded-contexts,C#,Design Patterns,Domain Driven Design,Cqrs,Bounded Contexts,我正在使用DDD原理制作一个应用程序。在尽可能仔细地思考了所有事情之后,我开始着手创建有界上下文。我还没有设置最终结构,但到目前为止,我的应用程序将由以下有界上下文组成: 员工管理 购买 档案馆 报告 我希望这是尽可能的可插拔,所以我可以例如开发和维护他们分开。他们可能会公开WCF或Web API与之交互 我会用。我不想一直使用事件源、消息总线等,因为这不是一个高度协作的应用程序(少于1000个用户,他们不太可能编辑相同的小数据集),这会增加很多不必要的复杂性 关于这些问题: 员工和部门实体对于

我正在使用DDD原理制作一个应用程序。在尽可能仔细地思考了所有事情之后,我开始着手创建有界上下文。我还没有设置最终结构,但到目前为止,我的应用程序将由以下有界上下文组成:

  • 员工管理
  • 购买
  • 档案馆
  • 报告
  • 我希望这是尽可能的可插拔,所以我可以例如开发和维护他们分开。他们可能会公开WCF或Web API与之交互

    我会用。我不想一直使用事件源、消息总线等,因为这不是一个高度协作的应用程序(少于1000个用户,他们不太可能编辑相同的小数据集),这会增加很多不必要的复杂性

    关于这些问题:

    员工和部门实体对于所有业务连续性都很常见,如何建模?

    部门是组织结构的一部分,因此在员工管理BC中,员工在一个部门工作,他们可以管理一个部门,并且他们有他们工作过的部门的历史记录

    在采购BC中,货物从一个部门采购,并交付给一个部门。供应商与不同部门签订了不同的合同

    在归档中,一些信息将被归档并绑定到一个部门,等等

    员工也是如此

    如何持久化有界上下文中的数据?

    它们可以映射到同一个数据库,也可以各自拥有自己的数据库

    我到目前为止的一些想法

    如何建模
    我是否应该再制作一个名为“公司”或“组织”的BC并管理那里的部门

    根据上面提到的Udi Dahans文章,我应该为每个BC创建一个部门实体和一个员工实体,其中只包含我需要的BC字段和行为。这听起来很合理,但我正在考虑如何实际使用它,我想不出来。我需要访问其他地方管理的部门,但我如何准确地做到这一点,而不混合我的业务连续性

    如何使用?
    假设我通过查询从somwhere获得部门列表。在UI中,我也会得到一个要购买的部门列表。这是该部门的第一次采购,因此采购业务连续性小组尚不了解该部门。。。因此,采购业务连续性中的部门对象将填充从另一个业务连续性维护的数据-那么我如何保持这一点?我需要添加一些信息,如送货地址和发票地址(如果不存在)

    在“注册部门UI”中,我是否应该在所有BC上调用“注册部门”服务,然后让舒尔确保这些服务与通过UI(MVC控制器)进行的所有更改同步

    员工也是如此。我想知道是哪位员工购买了某件物品或将其放入了档案。因此,不知何故,我也需要在这些BC中使用employee对象,但要从不同的BC中管理它们

    持续的
    上面的一些难题可以通过将不同的employee对象映射到数据库中的同一个表来解决。采购业务连续性和归档业务连续性不能注册新员工,而是将信息附加到现有员工身上,并将他们绑定到同一数据库中的其他对象。然后数据库会让舒尔知道所有BC仍然生活在同一个世界里


    我需要建议,这样我就不会做以后很难维护的东西了。

    你的大部分疑问似乎都围绕着:“不同的有界环境如何共享单个真实对象?”

    问题是,尽管实体是相同的,但每个BC对它们的处理都不同。在员工管理业务连续性中,整个权重集中在员工和部门实体上-您应该能够添加、修改、相互分配、保留历史记录以及处理与管理有关的所有业务逻辑。您可以实施一些保留员工个人数据、维护适当的官方结构或维护某些职责的政策

    另一方面,采购上下文中的部门实体仅表示发票地址,也可能是负责部门的人员,而利益中心将构建订单。所有与购买过程没有直接联系的数据都应提供给不同的上下文。例如,如果域要求每个订单都必须连接到部门,并且发票详细信息丢失,则采购上下文不应尝试自行填充这些信息。相反,可以向员工管理层发出通知,以填补缺失的部分

    请注意,它很可能发生在同一个应用程序中,甚至在同一个窗口中。但您必须确保它将通过员工管理上下文实现,即通过调用上下文公共API实现

    作为旁注,我不知道您的领域,但您可能希望重新考虑您的上下文边界,例如通过将交付与购买分开

    移动到使用,并遵循你的例子,如果你想购买,我会考虑以下路径:

    • 阅读必要的部门数据(让我们稍后再看“如何”),您可能希望检查此时是否存在所有数据
    • 阅读可以购买的商品,这取决于你的领域,可能值得介绍另一个BC,例如供应商。以上都是CQR的“查询”部分
    • 构建订单或任何其他必要的采购上下文实体,执行验证或任何其他逻辑
    • 提交更改、持久化购买上下文实体(“命令”部分)
    • 创建和发布一些域事件(例如通知存档或报告)
    最后但并非最不重要的是,你应该