David said:

Some more thoughts/assumptions on transient domain objects:
> 1. oid - annotate an attribute or use attribute naming pattern
> 2. Restful remoting mean client maintains required state - client doesn't
> care whether domain object is transient or not.
> 3. Restful remoting means the server trashes the domain object instance
> after the response. However domain behaviour is not transferred and
> everytime a behaviour is invoked on a domain object graph, the domain graph
> has to re-instantiated  at the server - big performance hit unless
> developer uses a cache (ehcache or similar).
> Am I wide of the mark with any of the above?



Jeroen said:

I do agree with David that there are plenty of use cases to think of where
> having a transient domain object on the server can be useful. I am
> wondering how comparable architectures deal with transient objects, perhaps
> an analogy with a Stateful Session Bean can be made? [1]. This would make a
> good topic of conversation on the IsisCon conference too.
> [1] http://www.jguru.com/faq/view.jsp?EID=917



And on 19 March 2014 21:29, David Tildesley <[email protected]> also
said:

> Maybe "transient" is misleading in my side of the discussion. Essentially
> a viewer should be able to instantiate an ISIS domain object that has no
> connection to DataNucleus, repository as such but can still have a domain
> service implementation fetch and put data from an external source (via,
> web-service, jms, whatever) and inject into the domain object. That keeps
> my domain layer intact and doesn't result in bleeding any domain behaviour
> out to other layers (e.g. view objects which are logically in the UI layer).
>
>
> However as Dan points out, this doesn't sit well with RESTful style. In a
> traditional app, UI layer (usually using a MVC model)  will make several
> invocations on domain object graph behaviour (fine grained method level
> calls) with state being maintained in the session for as long as needed
> over a series of client requests. This is not the case with RESTful style.
> Client is responsible for maintaining state with the server having no
> obligations in this regard. This does not sit well with a fine-grained
> method invocation on the domain layer - you would normally go for those big
> coarse grained calls and end up re-implementing a domain layer in the
> client that replicates domain behaviour. This is where the RESTful model
> falls into a heap (in my opinion) as the tradeoff is very significant. To
> retain the "finegrained" domain layer invocation on the server side in the
> RESTful style would necessitate rebuilding the relevant domain object graph
> with every call
>  and trashing it afterwards. This rebuilding "hit" could be mitigated by
> careful use of caching on the domain service layer, however the lifecycle
> of the domain object graph has to be completed on every RESTful invocation.
>
>
There's quite a few subtle points here to discuss.

One thing to say first off, perhaps "view model" also is not the right term
for what we have in Isis; it suggests that the object is only for
presentation purposes, but in fact it could be used as an entity that is
managed externally too.  In fact, over in Ireland on the "sister" .NET
project, we are doing something very similar to this with the equivalent
functionality provided by NO MVC.

Anyway... I understand the objection loud and clear about not having to be
forced to use DataNucleus to obtain entities.  And I also hear what you are
saying about REST and it moving all the state management client-side into
the viewer.  Obviously this isn't the intention; we want the domain logic
to be expressed only in one place, namely in Isis.  This is non-negotiable,
we're not trying to build something like EmberJS.

To answer the REST point briefly: the standard pattern is to have some sort
of (server-side) resource that represents the conversation/transaction.
 This is analogous to Jeroen's point about stateful session beans.  I'll
come back to this in a moment.

Let me get back to the main point about using Isis for domain objects whose
persistence is managed by some other mechanism.  I think that our (perhaps
misnamed) ViewModel mechanism will actually work quite well here; the
viewModelMemento() method / viewModelInit(String) methods provide a simple
mechanism by which the view model provide/gets a handle to the external
object.  (The memento is basically the Oid, as I've said).

And so, for example, it'd be trivial to implement stateful session beans
using this mechanism:
- we have a domain service that wraps the HttpSession interface.
- a view model is created and generates a GUID as its memento.  It uses
this GUID to store its state into the HttpSession through the domain
service.
- when the view model is recreated and init'd with that same GUID, it uses
the GUID to fetch its state from the domain service.  At the end of the
interaction, it flushes any changes back to the domain service.

One thing to note is that a view models OID is immutable.  However, all
that means is that the GUID it uses to fetch from the externally-managed
resource (eg HttpSession) doesn't change; the state keyed by that GUID
*could* change.

I'm pretty sure that the same general design can work for any other
externally-managed entity; so long as we have a unique identifier to it,
this can be the memento given to the view model.  Logically speaking this
view model is acting like an entity to the rest of the domain objects in
the Isis app; its just a wrapper around that externally-managed entity.

As I say, ViewModel is probably the wrong name/gives the wrong impression.
 (Unless one consider it to be the view not of the Isis app but of the
external system, which I suppose is true.... a sort of anti-corruption
layer).

All the above notwithstanding, it is worth noting that by ignoring
DataNucleus there are a few things that one would not get:
- dirty tracking, and automatic saving/persistence
- lazy loading
- querying
- auditing and object publishing (both of which leverages DataNucleus'
dirty tracking).

So I still think it'd be worth considering wrapping up a domain service as
a DN StoreManager impl.  I imagine that a lot of the boilerplate could be
factored out.  Just looking at the datanucleus-json implementation of
StoreManager [1], for example, it doesn't look *too* threatening.  I also
noticed that DataNucleus has a FederatedStoreManager, so there could be a
number of companion store managers for managing entities from these
external systems, operating alongside any entities that Isis itself manages
in the regular JDO ObjectStore.

To summarize:
- objects that implement Isis' ViewModel interface can be considered to be
entities if they are basically proxies to externally-managed entities
- but doing it this way means that a lot of the features of the ORM must be
re-implemented by hand.

Let's keep talking on this thread, it's useful and fundamental stuff

Dan

[1]
https://github.com/datanucleus/datanucleus-json/tree/master/src/java/org/datanucleus/store/json

Reply via email to