On Mon, Sep 15, 2008 at 4:19 PM, Rickard Öberg <[EMAIL PROTECTED]> wrote:
> Aggregates may have references to Entities within them, but no Entity
> may have a reference to an Entity within another.

Aggregate -> Aggregate (ok)
Aggregate -> Entity  (ok)
Entity -> Aggregate (ok)
Entity -> Entity (invalid)

Agree.

> Therefore, if we have
> a way to mark an Entity as being an Aggregate root, then for each
> Association from an Entity to another we can detect whether the
> associated Entity is within the same Aggregate by simply checking if it
> is marked as an Aggregate.

If you see my other post, if the Association contains both the source
and destination, it becomes a simple validation rule within the
Association class itself.

if( !src.isAggregate() && !dest.isAggregate() )
   throw new InvalidAssociationException( this );

> Also, if there is a schema change any rules for transformation of
> existing data should be applied to the Aggregate rather than single
> Entities. Properties may have been moved from one Entity in the
> Aggregate to another, and this cannot be handled if we view all Entities
> as "the same". If however we view the Aggregate as being the unit to be
> migrated, it's fine.

More importantly, the Aggregate construction could be of different set
of entities.

(I think we need terminology for the non-Aggregate)

> Another thing which becomes simpler is serialization. Only aggregate
> roots can be serialized, and Entities within it can almost be viewed as
> being identity-less for the purpose of serialization.

Well, kind-of...

> All access to an Aggregates internals comes through the Aggregate root.

... if that is the case, why have the internal entities at all?? If I
can't "take" an entity from one aggregate and assign it to another,
what's the point?

> If you then consider what was stated in the Amazon research paper on
> almost-infinitely scalable systems, it feels like those methods quite
> often should be message-oriented, i.e. when invoked they will be sending
> a message to the Entity rather than just invoking a method in an
> RPC-style. The message should assume that it's potentially going over a
> network, so doing it in a document-style and asynchronously is probably
> a good idea. There's lots of interesting things that can be done here I
> think, when it comes to calling Aggregate methods and automatically
> convert them into messagebased conversations.

I think ~4 years ago I wrote a blog entry about the "brokeness" of
RPC, and argued that a conversation-styled interaction should be
developed. I argued that in the real world there is no "contract"
between how two parties interact conversationally. If I don't
understand what you are saying, I can ignore you or make a guess what
you mean, and more importantly I can learn what you really mean
without you changing your way of communication. I am sure that a whole
new set of problems would develop as a result, but I think that the
"natural order" is more evolution-friendly... Anyway!!!


> As for Queries, one question is whether it should be allowed to Query
> for Entities within an Aggregate. But, since the references into an
> Aggregates Entities is maintained automatically I think it might be ok
> to "find" Entities within Entities this way. The main rule is to not
> have references to those Entities from Entities in another Aggregate,
> which is the main problem to be avoided.

Yes. The query should probably be allowed, but if there is no
reference back to the "owner" then assign to a new aggregate is not
far away. But then, I wonder, shouldn't it have a reference to the
owning Association instead?

> These are just some of the thoughts on Aggregates. However, it seems to
> me that the main API change might be to have an AggregateComposite
> subtype of EntityComposite, which is used as a marker interface for
> Aggregate roots. Most of the other logic follows from that I think. Not
> sure if the Aggregate root has to have any new methods, but that might
> be required.

I am not confident that there should be a Aggregate subtype but not a
"Owned" subtype. Can an Aggregate be "Owned"? Probably. So we are
looking for two types, where Aggregates can only own the "Owned"
types??

It feels a little bit like the Composite supertype, which we have
found is not clever to use for "everything else". More discussion
needed on this topic, but in general I totally agree that we need
"something" and we have discussed this on and off since last year, so
I feel good that we are now taking some actions.


Cheers
Niclas

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to