Why is MagmaSession>>#noteOldKeysFor: necessary?

Chris Muller asqueaker at gmail.com
Mon Jan 4 00:47:41 UTC 2010


Hi,

> I'm using Magma and finding out how transparent it can be. I'm trying Magma
> to see if the DDD principles can be applied to it. To retrieve, store and
> save aggegrate root objects a Repository object is used. A 'transient'
> Repository object is nothing more than a wrapper around an
> OrderedCollection, which contains store save and find methods. The client
> who is using this Repository object does not know which implementation is
> behind it. After retrieving the initial root aggegrate the client can
> manipulate the sub objects of the aggegrate root.
>
> I managed to achieve Read Transparency. I specialised the Repository objects
> so they use a MagmaCollection instead of an ordinary OrderedCollection.

Use of a MagmaCollection vs. an OrderedCollection should be based on
application requirements.  Either type of collection works equally
well whether transient or persistent.  I recommend just picking the
best one for the needs of that particular collection and sticking with
it.

> To do a Write Transparency, I added a decorator around the store / save
> methods of the Repository which automatically wraps the original Repository
> object in a session commit:[] block; enabling Magma to see the changes made
> to the 'saved' object and get them persisted.
> AddTransactionAroundMutators>>doesNotUnderstand: aMessage
>    |result|
>      (self isMutator: aMessage)
>       ifTrue: [repositoriesController commit:
>         [result := aMessage sendTo: decorated]]
>       ifFalse: [result := aMessage sendTo: decorated].
>     ^result.

Hmm, to me, this is not worth the complexity.  If you want your domain
to be in control of the transactions (as opposed to the user), I
suggest signaling MagmaSessionRequests.  See
http://wiki.squeak.org/squeak/5605 if you haven't already.

> So I'm using a second MagmaSession to reload the object I'm about to commit
> and I'm noting to the first session to noteOldKeysFor: anObject
> usingHashingFromObject: theJustReloadedObjectFromTheSecondSession. Like
> this, the first session gets the hashes of the unmodified object in the
> repository, and the hashes get updated correctly automatically. It is a
> working solution (at least with my very limited testing), but I find it very
> complicated. Surely there must be a cleaner way to do an automatic hashkey
> update.

Wow, please do not do this approach, I agree it is way too complicated
and definitely not the right way to use Magma.

Please use MagmaSessionRequest (signalNoteOldKeysFor:, et al) and
handle it in whatever app-level controller you're using.  It is benign
if it isn't handled, so transient applications will work
transparently.

> Other things I already tried is to enable WriteBarrier, but could not get
> that working.

WriteBarrier is a separate package which I don't believe works on
Pharo.  I do not maintain this package.

> Can anyone help me on this one? I'm finding it a bit strange that Magma can
> correctly save my changes, but not determine if a hash key update is
> necessary.

Detecting key changes automatically was impossible without slowing
down commits; the

  MagmaSessionRequest signalNoteOldKeysFor: myAttribute

is so easy to just put into the appropriate setter, so it wasn't a
good trade-off to compromise performance for this minor increase in
transparency.

Regards,
  Chris


More information about the Magma mailing list