A few thoughts:
Instruction
seems like it serves the purpose of a command DTO and a value object used to store an audit trail. Decouple these two concepts.The
Bond
entity, as is typical for financial domains, calls for event sourcing. In effect, you're already there by storing all instructions and resolutions. Make it explicit. You may not need to store all the instructions if you instead make any changes to a bond explicit as domain events. A single instruction can result in multiple events.The example of a domain service is actually an application service or a command handler. An application services coordinates repositories and delegates to domain objects. To best implement an application service, delegate as much business logic to domain objects, a
Bond
in this case. Therefore, have theBond
entity decide exactly which sub-behaviors to call so that the application service only calls a single method on the entity.To provide polymorphism, create a value object to allow representation of different bond types. Have the Bond entity delegate to this polymorphic bond type value. You may need a factory to initially instantiate this bond type VO, but once it is associated with the Bond entity, you no longer need to call the factory, the Bond simply references the bond type VO.