Drive model inspection through real UnitOfWork and support modules#153
Merged
stefanmirkovic merged 1 commit intofeature/af5-model-inspectionfrom May 6, 2026
Conversation
This is a proposal PR to the original PR posed by Mirko, #146. It takes a different approach to the same problem, and functionally nothing has changed ## Why the proposal The original approach was very reflection-heavy, which is partly to be expected, but can also be improved upon. The more inner reflection is present, the more likely it's to break. In addition, the approach didn't account for entites in submodules for hierarchic contexts. As such, only top-level entities would be discovered. As this all requires very deep knowledge about how the Configuration of Axon Framework works, I decided to make this proposal PR to guide by example, instead of separate comments. ## Basics of the rewrite 1. The `UnitOfWorkFeactory.create()` is used during all sourcing and read operations. This way all parameter resolvers will work correctly. This takes away the need of manually invoking methods. 2. Repository instances are discovered at boot time. If it's an EventSourcingRepository, it's registeredd to the `RSocketModelInspectionResponder` 3. The `EventSourcingRepository` is rebuilt using reflection to be able to decorate the `EntityEvolver` with the `AxoniqPlatformEntityEvolver`. 4. Reading the event stream and entity state is now a `Repository.load(...)` operation. Several resources are put in the `ProcessingContext`, which the decorators respond to. a. `AxoniqPlatformEntityEvolver.BEFORE_CONSUMER`: If present, calls with the entity state before any evolve b. `AxoniqPlatformEntityEvolver.AFTER_CONSUMER`: If present, calls with the entity state after any evolve c. AxoniqPlatformEntityEvolver.MAX_INDEX: Stops evolving the entity after a certain index. ## Result With the new code a lot of the reflection-based code could be deleted. The RSocketModelInspectionResponder.kt shrunk by half its size. We have programmed against the interfaces of the framework, which are less likely to change. In addition I added tests that confirm it works.
|
This was referenced May 6, 2026
stefanmirkovic
approved these changes
May 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



This is a proposal PR to the original PR posed by Mirko, #146. It takes a different approach to the same problem, and functionally nothing has changed
Why the proposal
The original approach was very reflection-heavy, which is partly to be expected, but can also be improved upon. The more inner reflection is present, the more likely it's to break.
In addition, the approach didn't account for entites in submodules for hierarchic contexts. As such, only top-level entities would be discovered.
As this all requires very deep knowledge about how the Configuration of Axon Framework works, I decided to make this proposal PR to guide by example, instead of separate comments.
Basics of the rewrite
UnitOfWorkFeactory.create()is used during all sourcing and read operations. This way all parameter resolvers will work correctly. This takes away the need of manually invoking methods.RSocketModelInspectionResponderEventSourcingRepositoryis rebuilt using reflection to be able to decorate theEntityEvolverwith theAxoniqPlatformEntityEvolver.Repository.load(...)operation. Several resources are put in theProcessingContext, which the decorators respond to. a.AxoniqPlatformEntityEvolver.BEFORE_CONSUMER: If present, calls with the entity state before any evolve b.AxoniqPlatformEntityEvolver.AFTER_CONSUMER: If present, calls with the entity state after any evolve c. AxoniqPlatformEntityEvolver.MAX_INDEX: Stops evolving the entity after a certain index.Result
With the new code a lot of the reflection-based code could be deleted. The RSocketModelInspectionResponder.kt shrunk by half its size. We have programmed against the interfaces of the framework, which are less likely to change.
In addition I added tests that confirm it works.