I've added this note as a comment on ISIS-1283.

On 9 December 2015 at 20:36, Óscar Bou <[email protected]> wrote:

> To document it here, what would be need to change would be current
>
> ActionInvocationFacetForDomainEventAbstract.internalInvoke
>
> implementation, when invocation is cacheable.
>
>
> Regards,
>
> Oscar
>
>
>
>
>
> > El 9 dic 2015, a las 21:25, Óscar Bou - GOVERTIS <[email protected]
> <mailto:[email protected]>> escribió:
> >
> >
> > Hi all.
> >
> > I’m experiencing a bad behavior using SAFE_AND_CACHEABLE actions
> implemented on Domain Entities.
> >
> > As current QueryResultsCache implementation has as its Key the calling
> class, instead of the concrete domain entity that has invoked it, it will
> return the cached result when invoking the same action on different domain
> objects.
> >
> > For example, I have the following action:
> >
> > public class Product {
> >
> >     // {{ findStockForSupplier (action)
> >     @Action(semantics = SemanticsOf.SAFE_AND_REQUEST_CACHEABLE)
> >     @ActionLayout(hidden = Where.ANYWHERE)
> >     @MemberOrder(name = "supplierTerms", sequence = "3")
> >     public BigDecimal findStockForSupplier(
> >             final Supplier supplier) {
> >         final ProductSupplierTerms productSupplierTerms =
> this.wrapSkipRules(this).findTermsForSupplier(supplier);
> >         return productSupplierTerms != null ?
> productSupplierTerms.getStock() : BigDecimal.ZERO;
> >     }
> >
> > }
> >
> >
> > If I invoke that action over 2 different Products (ie, Product
> instances) as per:
> >
> > final ProductSupplierTerms productSupplierTerms1 =
> this.wrapSkipRules(product1).findTermsForSupplier(supplier);
> >
> > final ProductSupplierTerms productSupplierTerms2 =
> this.wrapSkipRules(product2).findTermsForSupplier(supplier);
> >
> >
> > For the second invocation it will return the cached result, as only the
> class is considered on the QueryResultsCache and not the instance
> “identity”, and both “product1” and “product2” are Product instances.
> >
> >
> > As all Domain Entities implement the Comparable interface, perhaps it
> might be considered.
> >
> > Until now, I didn’t noticed this because I always used the
> QueryResultsCache for Domain Services, and they have only 1 instance in
> production.
> >
> > But it’s not the same when the SAFE_AND_CACHEABLE actions are
> implemented on Domain Entities.
> >
> >
> > Perhaps the solution would be to simply change the QueryResultsCache.Key
> implementation to accept an Object instead of a Class, using the
> “Comparable” interface if implemented to differentiate between objects (for
> Domain Objects), and the “equal” operator when not present (for Services)?
> >
> > Thanks,
> >
> > Oscar
> >
> >
> >
> >
> >
> >
> >
> >
>
>

Reply via email to