聚合内引用别的聚合根应该如何初始化?

    
JasonMing
13-12-17 5 1113 1

现在有如下的一个结构(不好意思,不知道怎么上图,代码表示):


class Schedule : AggregateRoot
{
IList<ScheduleItem> items;

class ScheduleItem : Entity
{
Duration duration;
Config config; // 这里引用了一个聚合根

class Duration : ValueObject {}
}
}

class Config : AggregateRoot {}


现在问题是,如果我初始化schedule的时候,也就是我获取schedule的时候,ScheduleItem里面引用的Config是否也应该要初始化?
如果要的话,我是不是应该在ScheduleRepository里面注入ConfigRepository,然后在重建Schedule的时候把对应的Config设进去?
那如果config这个对象很大,我想用lazy load,但是项目里面暂时不用Domain Event相关的组件,我是要把ConfigRepository注入到Schedule中吗?但貌似书上说不要这样做,那我应该怎么做呢?

1
banq
2013-12-17 11:00


2013-12-17 10:19 "@
JasonMing"的内容
,如果我初始化schedule的时候,也就是我获取schedule的时候,ScheduleItem里面引用的Config是否也应该要初始化? ...


一个聚合根A要依赖另外一个聚合根B,有几个办法供参考:
1.A中引用B的ID,你这里是直接引用Config 对象,应该是Config 实体ID。

2.A向B发送消息事件,两个聚合根通过事件交互。

3.A使用B分享出来的一个值对象,这是第一条的扩展。ID也是一个值。

那么你这个案例,由于不能使用事件,建议采取1 和3。原则是不能直接引用另外一个聚合根实体。

这个问题解决了,另外一个聚合根实体的初始化和你这个聚合根初始化是独立的。就没有初始化冲突等问题。

[该贴被banq于2013-12-17 11:02修改过]

JasonMing
2013-12-17 11:10


2013-12-17 11:00 "@
banq"的内容
1.A中引用B的ID,你这里是直接引用Config 对象,应该是Config 实体ID。 ...

感谢@banq 的回答,如果我是通过ID引用的那是否会变成如下的形式?

class ScheduleItem : Entity
{
Id configId;
Config GetConfig()
{
// 但是这里应该怎么实现呢?
}
}

但是GetConfig里面要实现的逻辑就是要从ConfigRepository里面根据Id加载一个Config的对象,那是否意味着我要把ConfigRepository注入给SheduleItem(或者它的聚合跟Schedule)?

banq
2013-12-17 11:27


2013-12-17 11:10 "@
JasonMing"的内容
GetConfig里面要实现的逻辑 ...


使用Config ID只是指引一个方向,如果你要获得Config里面的内容,比如你要GetConfig,那么取决于你要获得GetConfig什么内容做什么事情,可否委托给Config去做。

如果只是获得几个关键的值,这里不是Config ID,而是ConfigVO值对象了,也就是ConfigVO值对象与ScheduleItem 生成时一起生成。初始化有两个地方,一个是内部构造函数,一个是外部,这里是指外部。

比如外部获得ScheduleItem时,同时获得Config这个聚合,从中获得ConfigVO值对象,然后注入到ScheduleItem中。

JasonMing
2013-12-17 12:02


2013-12-17 11:27 "@
banq"的内容
使用Config ID只是指引一个方向,如果你要获得Config里面的内容,比如你要GetConfig,那么取决于你要获得GetConfig什么内容做什么事情,可否委托给Config去做。

如果只是获得几个关键的值,这里不是Config ...


我是否能这样理解:

引用其它聚合根的时候通常是通过“引用ID”或者“保持它们对应的值对象”。
如果是引用ID的话:在外部(Domain层之上)通过ScheduleRepository获取到Schedule后,在需要使用引用到的Config时再在外部通过SchedulerItem中引用的Config.Id从ConfigRepository中根据Config.Id获取Config的实例。

如果是保持值对象的话:在通过ScheduleRepository中重建Schedule的时候就通过ConfigRepository获得Config的实例并且转换为对应的VO注入到ScheduleItem中去,这样当Schedule重建完成之后就已经拥有了Config的信息(但不是他的实体)。

我的理解可能有点啰嗦,还望指点一二。
[该贴被JasonMing于2013-12-17 12:03修改过]

2Go 1 2 下一页