18

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

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

您在 HR 上下文中是否有一个 Employee 实体,SalariedEmployee在会计上下文中是否有一个 Value-Type(例如 )?

class Employee
{
    public BankAccount BankAcountDetails { get; set; }
    public string FullName { get; set; }
    public Address ResidentialAddress { get; set; }
    public string SalaryRef { get; set; }
}

SalariedEmployeeclass (??) : 员工的值类型

class SalariedEmployee
{
    public SalariedEmployee(string salaryRef, BankAccount bankAcountDetails)
    {
        ...
    }

    public string SalaryRef { get; }
    public BankAccount BankAcountDetails { get; }
}

限界上下文中的 HRService 是否返回此信息?还是在这两种情况下都使用 Employee 类?

4

4 回答 4

16

来自http://msdn.microsoft.com/en-us/library/jj554200.aspx

Bounded contexts are autonomous components, with their own domain models and their own ubiquitous language. They should not have any dependencies on each other at run time and should be capable of running in isolation.However they are a part of the same overall system and do need to exchange data with one another.

If you are implementing the CQRS pattern in a bounded context, you should use events for this type of communication: your bounded context can respond to events that are raised outside of the bounded context, and your bounded context can publish events that other bounded contexts may subscribe to. Events (one-way, asynchronous messages that publish information about something that has already happened), enable you to maintain the loose coupling between your bounded contexts.

于 2013-09-10T09:14:38.443 回答
6

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

如果 HR 创建了 HRM.Employee,则可能会引发一个事件,Accounting 会选择并创建一个 Accounting.Employee。

于 2012-07-24T12:45:13.143 回答
2

如果需要多个上下文,那么某些事物肯定可以在某些上下文中建模为实体,而在另一种上下文中建模为值对象。从实体到值对象的转换通常很简单,但从值对象到实体可能并不那么简单。来自领域驱动设计,p。337:

翻译机制不是由模型驱动的。它不在有界上下文中。(它是边界本身的一部分,将在上下文图中讨论。)

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

于 2011-11-23T16:19:09.190 回答
1

我想我不会在两种情况下都使用相同的实体。他们应该是有界的。如果我必须根据一个上下文的需要更改我的员工类怎么办?......“应该是有界的上下文”不再那么有界了。

我会使用一个值对象。诀窍是正确定义值对象。我看到那些等同于“数据类型”对象,就像整数是整数一样。这当然是有挑战性的(int16,int32...)。但是让我们假设是这样的。Employee 是值对象的好候选人吗?....我不这么认为:(...您可能不需要在有界上下文中为 Employee 提供相同的信息集。在另一个名称中,员工的标识信息是更好的候选人(名字,姓氏,中间名......)你可以在有界上下文中重用。

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

希望这可以帮助 :)

于 2011-11-24T10:07:01.630 回答