AddOutValue not working in 4.5 if objects are equal

AddOutValue not working in 4.5 if objects are equal

Old forum URL: forums.lhotka.net/forums/t/11719.aspx


mesh posted on Thursday, November 22, 2012

Hi, I have a problem with new rule engine 4.5 of CSLA.

While returning object (not value!) from asynchronus validation rule with using RuleContext.AddOutValue, property is not being set if value from rule and the one that is currently present on property are equal (Object.Equals).

I was wondering do you have any advice on how to force setting of property despite the comparison that is made in Equals method.

Kind regards,
mesh

JonnyBee replied on Thursday, November 22, 2012

Well, that is basically how LoadProperty/SetProperty works - to update the field only when the value differs.

I would take new look at the code and try to avoid this.

BusinessRules should NOT be used for data access and load new child objects (if I understand correctly).
I would rather prefer to do Async LazyLoad on the <bo>.<Property>

The only "safe" workaround is in the callback method to call LoadProperty(context.Target, PropertyInfo, null) so the values will differ when the rule engine processes the OutputValues.

mesh replied on Thursday, November 22, 2012

Thanks.

Yes, it would be great if I can choose to "force" Load/SetProperty.

ProvideTargetWhenAsync/LoadProperty(context.Target, PropertyInfo, null)  workaround is allowed when BusinessRule is async?

JonnyBee replied on Thursday, November 22, 2012

Yes, they are.

But remember - BusinessRules should NOT be used as Data Access to load business objects.

mesh replied on Friday, November 23, 2012

I am only using BusinessRule to fetch/replace readonly child object (key/value implementation of foreign key concept), for example, UI code can set only "key" part of foreign key property. Business rule then kick in, it fetch and replace that foreign key child object with key AND value (value can be string or read only "info" object) from database.

That way I'm keeping BO properties clean, can reuse rules and I can unit test business rules.

I hope I'm doing the right thing?

JonnyBee replied on Friday, November 23, 2012

My preference is to have the key and value as separate properties in the BO.
ReadOnly objects may work with this - but editable must NEVER be used like this.

In terms of Undo and Serialization/Deserialization this is the best solution (IMO).

So I prefer to only use the key and then the async business rule will update the value in the BO.

Unit test and reuse of rules works just as good.

Copyright (c) Marimer LLC