2011-05-19 117 views
1

我可以使用一些帮助理解我的域模型,并确保我正确地接近设计。定义边界和聚合根之间的通信

我有一个称为部门的聚合根。 Department对象具有多个子值类型,可帮助定义“部门”的业务概念。在我的用户界面中,用户可以列出,创建,编辑和删除部门对象。

我有另一个称为项目的聚合根。一个项目有几个孩子价值类型,但也与部门有关系,因为每个项目都是由一个部门“拥有”的。项目可以创建,编辑,删除等,这样做对部门没有影响,而删除部门也会删除它拥有的任何项目。

我的用户界面将根据当前用户有权访问的部门显示项目列表。他们可能可以访问多个部门。当同时显示为列表项目和详细信息时,我需要在项目中显示部门徽标。

我的第一个想法是该项目是一个具有简单DepartmentID属性的聚合根,可用于'查找'部门。但现在我开始认为我真的只有一个聚合根:部门。

您认为如何?

UPDATE

我不知道这是否是关键讨论或改变什么,但下面的思想读第一对夫妇的答案后,发生在我身上。

处似乎有两个背景:

  1. 作为该 支持修改一个独立的实体。
  2. 作为 案件中包含只读数据和 项目的子项目没有任何行为。

这让我觉得我应该在我的模型中有两个'对象',案例#1的聚合根和案例#2的值类型。我在正确的轨道上吗?

回答

1

由于项目不能存在没有部门它可能不是一个聚合根。从你的描述来看,你听起来像只有一个AR--部门,你用它来管理里面的项目。

如果你的行为大多是CRUD,我不建议为它建立一个完整的域模型,因为可能有更简单的方法。

UPDATE 正如你所提到的,你可能在这里有两个有界的上下文。一个部门是AR和项目是AR的实体。在这种情况下,您将对您的部门执行操作。在公元第二年,您的项目可能是AR,部门可能是实体或VO。这将允许您直接处理项目。

我还建议您与您的领域专家一起讨论这些问题,看看这些概念是否适合您的UL,或者寻找一些可以澄清您的模型的缺失概念。我特别想找一个可能将项目与部门联系起来的概念。

+0

只有部门的接口/ API是CRUD。有很多与项目相关的操作和行为,这就是为什么我最初将其视为一个聚合。 – SonOfPirate 2011-05-20 11:19:19

+0

即使一个项目如果没有所有权而不能“存在”,这难道不是一个有效的规则吗?我的意思是,如果Project不是一个聚合根,那么当我的许多用例开始浏览项目列表,选择一个项目并执行任务时,我必须实例化部门以导航到项目针对该项目,例如编辑它的属性。我真的需要通过Department来做到这一点吗?在这种情况下,Department只是一个价值型装饰项目吗?这是我混乱的根源。 – SonOfPirate 2011-05-20 11:21:46

+0

如果您将它们建模为单独的AR,然后删除部门,如果您还想删除项目,则必须使用跨AR的工作单元,这是不推荐的,在某些情况下甚至可能不可能(分区,事件采购)。我会更新答案以提供有关更新部分的信息。 – 2011-05-20 13:20:10

1

我认为完全有理由让Project和Department都是聚合根,因为它们都是独立管理的。

也就是说,每个项目和每个部门都有某种唯一的标识符,虽然可以将项目添加到部门,但项目本身可能足够复杂(拥有自己的生命周期,自己的子对象等)以保证聚合根状态。

您只需在每个项目中保留对该部门的参考。要回答

+0

您的意思是“在每个项目中引用该部门”的字面意思,因为当我返回一个Project对象时,它包含对关联的Department对象(及其所有子对象)的引用?如果Project需要时暴露一个DepartmentID属性并通过其他方式查找Department对象,会更好吗? – SonOfPirate 2011-05-20 12:31:07

+0

那么,在你的域名中你可以保留一个实际的引用,或者只是一个Guid(或其他唯一标识)属性。 这取决于你是否总是需要访问每个项目,只要你在你的部门工作,我认为这不太可能。 只要您正确地管理关系,您对域的建模方式真的取决于您。到目前为止,我更喜欢使用ID。假设您的Project聚合根拥有一个DepartmentId属性。那么万一您的业务逻辑需要它,您只需通过调用其GetById方法从DepartmentRepository中检索正确的部门。 – 2011-05-20 12:48:02

+0

很多人喜欢只参考Id。我使用Nhibernate。 Nhibernate具有延迟加载,所以实际上我只有id,直到我尝试访问另一个聚合,然后NH去获取它。这个摘要检索另一个ag。关于你的陈述“对相关部门对象(及其所有子女)的引用”我认为如果你要保持对实际对象的引用,那么你必须使用某种形式的延迟加载。否则,在非常短的时间内,您将检索一个对象,并在内存中结束整个系统对象图。 – Raif 2012-06-30 17:15:01

0

几个简单的问题:

1)可以在部门域对象居住通过自身没有项目域对象。 - 如果是的话,那么该部门是一个整体。

2)是该项目的域对象可通过其自身的生活 - 如果是,则该项目还聚集

3)是项目与一个部门的关系 - 那么它应该是项目集合的一部分作为财产部门公开

4)部门是否与一个或多个项目对象有关系 - 项目汇总应该是部门汇总对象的一部分。

因此,使用Department集合对象,您可能需要访问Project对象的列表,并且一旦拥有Project对象,您可能需要访问Department对象。这是一个过时的罚款循环参考。

这是员工有一个经理和经理有一个员工名单的典型示例

+0

是的所有4个问题。你将如何处理关系?项目的部门财产是否参考实际的部门对象或代表该部门的轻量值对象? – SonOfPirate 2011-05-21 01:20:40