I try understand what is the best way for filling property from one Aggregare Root to another.
I have Model Aggregate Root
, Category Aggregate Root
, Filter Aggregate Root
Every Model
can have some Filter
list, and can be in one of the Category
. Category
can have a Filter
for inheriting to the Model
. When Category
property of the Model
is updated, Filter
must be inherited from Category
to the Model
, and when Filter
property is updated in the Category
, all Models
from that Category
must inherit new value. All inherited Filters
can't be updated, but manually added filters can be edited.
One way I "invent" is using Process manager
with state which contains Category filter
and Models list
.
So I will have such behavior:
Category AR
UpdateCategoryFilter (command) -> CategoryFilterUpdated (event)Model AR
AddCategory (command) -> CategoryAdded (event), RemoveCategory (command) -> CategoryRemoved (event), InheritFilter (command) -> FilterInherited (event), RemoveInheritedFilter (command) -> InheritedFilterRemoved (event)Filter AR
CreateFilter (command) -> FilterCreated (event)FilterInheritance
have correlationIdResolver
by categoryId
, triggers on [CategoryFilterUpdated
, CategoryUpdated
] eventsPM behavior is like:
on event use current State(filter, models) =>
if CategoryFilterUpdated(categoryId, newFilter) =>
set new State(newFilter, models) {
models.forEach(send InheritFilter(model, newFilter))
}
if CategoryAdded(modelId, categoryId) =>
set new State(filter, models.add(modelId)) {
send InheritFilter(modelId, filter)
}
if CategoryRemoved(modelId, categoryId) =>
set new State(filter, models.remove(modelId)) {
send RemoveInheritedFilter(modelId, filter)
}
Is this a right way? Is there some other ways?