Domain driven design 域驱动设计中跨有界上下文的实体

Domain driven design 域驱动设计中跨有界上下文的实体,domain-driven-design,entity,value-type,bounded-contexts,Domain Driven Design,Entity,Value Type,Bounded Contexts,我试图理解实体如何在多个有界上下文中运行 给一个公司的雇员。在(例如)人力资源上下文中,此人有姓名、姓氏、地址、工资参考号和银行帐户。但在会计方面,所有相关的都是工资参考号和银行账户 在人力资源上下文中是否有员工实体,在会计上下文中是否有值类型(例如,受薪员工) class员工 { 公共银行帐户BankAcountDetails{get;set;} 公共字符串全名{get;set;} 公共广播地址{get;set;} 公共字符串SalaryRef{get;set;} } 受薪员工类别(??):

我试图理解实体如何在多个有界上下文中运行

给一个公司的雇员。在(例如)人力资源上下文中,此人有姓名、姓氏、地址、工资参考号和银行帐户。但在会计方面,所有相关的都是工资参考号和银行账户

在人力资源上下文中是否有员工实体,在会计上下文中是否有值类型(例如,
受薪员工

class员工
{
公共银行帐户BankAcountDetails{get;set;}
公共字符串全名{get;set;}
公共广播地址{get;set;}
公共字符串SalaryRef{get;set;}
}
受薪员工
类别(??):员工的价值类型

class工薪员工
{
公共受薪员工(字符串salaryRef,银行账户bankAcountDetails)
{
...
}
公共字符串SalaryRef{get;}
公共银行帐户BankAcountDetails{get;}
}

受限上下文中的HRService是否返回此信息?或者在这两种上下文中都使用Employee类?

如果需要多个上下文,那么肯定可以在某些上下文中将某些事物建模为实体,在另一个上下文中将其建模为值对象。从实体到值对象的转换通常很简单,但从值对象到实体的转换可能不那么简单。从,p。337:

转换机制不是由模型驱动的。它不在里面 有界上下文。(这是边界本身的一部分,将 在上下文映射中讨论。)


如果人力资源环境需要向会计环境询问有关某个特定员工的问题,这将成为一个令人困惑的问题。

我想我不会在两种环境中使用相同的实体。它们应该是有界的。如果我必须更改我的employee类以满足一个上下文的需要,该怎么办?。。。“应该是有界的上下文”不再那么有界了

我会使用值对象。诀窍是正确定义值对象。我看到这些都相当于“数据类型”对象,就像一个整数就是一个整数。这当然是有挑战性的(int16,int32…)。但让我们假设是这样。员工是价值对象的合适人选吗?。。。。我不这么认为:(…您可能不需要在有界上下文中为员工提供相同的信息集。换言之,员工的身份信息是更好的候选者(firstname、lastname、middlename…),您可以在有界上下文中重用这些信息

现在,服务层是否应该返回此值对象?…个人分析我不会这样做。我更希望在我的存储库中定义此可重用性。在Nhibernate中共享映射或共享相同的投影/映射器类


希望这有帮助:)

如果它们是严格分开的,我会让它们严格分开。在不同的名称空间中有两个不同的类。每个都有不同的属性

如果人力资源部创建了一个HRM.Employee,则可能会引发一个事件,会计部会拾取该事件并创建一个Accounting.Employee。

来自:

有界上下文是自治组件,具有自己的域模型和自己的通用语言。它们在运行时不应该相互依赖,应该能够独立运行。但是,它们是同一个整体系统的一部分,需要彼此交换数据


如果在有界上下文中实现,则应使用事件进行此类通信:有界上下文可以响应在有界上下文之外引发的事件,并且有界上下文可以发布其他有界上下文可能订阅的事件。事件(发布已发生事件信息的单向异步消息)使您能够保持有限上下文之间的松散耦合。

您是说我上面给出的示例是一个好主意,还是说它在DDD中是“允许的”和常见的?这是一个好主意。它非常清楚地表明,就任何业务逻辑而言,会计环境并不区分受薪员工。你只需要确信,会计环境永远不需要区分它们。