Back to Hexagonal Architecture
One note upfront, this is all stuff I have been thinking about and doing for a while now, and this is the first time I have attempted to document. As a result I have a huge backlog of thoughts and ideas that are competing to get onto the screen. I will probably have to redo these several times before they are clearly written.
But moving on, last time I described, at a high level, the implementation of the Transform Classes. You have one transform for each subsystem (UI, Network, DataAccess). Any transform can handle ServiceRequests via its ProvideService method, and any Transform can consume services via its RequestService method. When the result of the ServiceRequest is received, a delegate specified by the transform should be called with the ServiceResult. Since your transforms are ignorant of eachother, the only way they could possibly communicate is via their ProvideService and RequestService methods. However right now there is no one to do the job. The MetaTransform fills this role.
This is a component whose job is simply to route Requests that are raised by one transform to another transform that can process the request. If your UITransform raises a PlaceOrder request, then it will probably be handled by the ClientNetworkTransform, which will somehow pass the result over the network to a ClientServerTransform, which will need to raise the reqeust yet again on behalf of the remote user. At this point it can be handled by the DataAccessTransform. The result of the ServiceRequest will then be passed back along the chain via the asynchronous delegate mechanism described previously.
If you are supporting domain events, they can be raised by the DataAccessTransform, and routed to clients as appropriate for your application. Note that this requires that your transport mechanism supports bidirectional communication.