开发者

How do you persist/restore aggregate roots with entities in DDD?

开发者 https://www.devze.com 2023-02-14 02:58 出处:网络
Based on the following definitions from Domain-Driven Design: Tackling Complexity in the Heart of Software,

Based on the following definitions from Domain-Driven Design: Tackling Complexity in the Heart of Software,

An aggregate is: A cluster of associate开发者_运维知识库d objects that are treated as a unit for the purpose of data changes. External references are restricted to one member of the AGGREGATE, designated as the root. A set of consistency rules applies within the AGGREGATE'S boundaries.

I don't think the Aggregate root should hold a reference to the repository. Since the Aggregate root is the only one that should be holding references to its entities and aggregates, they should be private.

How can my repository persist and restore this private data ?


Edit:

Let's take the classic Order, OrderLines example.

An order is the Aggregate root.

It's lines are Entities.

Since the Aggregate root(order) is the only object allowed to hold references to its entities (order lines), I do not understand how would I persist order lines from the repository.


As far as I understand the aggregate root, it must be the place to access all the entities inside it's scope. That means, as long as traditional ORM is used, that you can access the OrderLines throug the Order.

Further it is not forbidden for anyone to grab a reference to the entitiy inside the root, but these references must be volatile (i.e. short lived) and you must obtain the rerefence via the aggregate root.

In terms of DDD you will use a repository to hide data access, the factory might in turn use a factory to assemble the object. The facotry knows well about the internal structure of the object and must be able to build up a new object or restore one from the data the repository hands over.

Perhaps you might also look into CQRS + Event Sourcing which provides a different approach to persisting entities.


Well, most folks consider the repository to be a logical feature of hte aggregate root (since there's only one per aggregate, in traditional DDD), so it does & should have access to the orderlines.

If you really want them to be private, though, you would need to resort to reflection, or else have the aggregate root entity return them in some persistable fashion (perhaps w/ an internal call of some kind).

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号