public final class DirtyMemento extends Object
提升系统性能,因为降低了数据库交互.
DirtyMemento
被Entity
组合进去,用来(主动)通知Repository
哪些状态改变了(变脏了/新增了/删除了).
通过这个机制,repo.save(entity);
可以通过一个save方法支持所有的状态改变场景.
DirtyMemento
仅限于一个聚合根;对于跨聚合根的情况,使用IUnitOfWork
.
进阶应用:不仅普通聚合根上使用,IBag
上也可以.
class OrderEntity {
private DirtyMemento dirtyMemento = new DirtyMemento();
public void foo() {
dirtyMemento.register(new FooHint(this));
}
public void bar() {
dirtyMemento.merge(new BarHint(this));
}
}
class OrderRepository {
void persist(Order order) {
DirtyMemento dirtyMemento = order.getDirtyMemento();
if (dirtyMemento.isEmpty()) {
return;
}
FooHint fooHint = dirtyMemento.firstHintOf(FooHint.class);
dao.executeFoo(fooHint);
BarHint barHint = dirtyMemento.firstHintOf(BarHint.class);
dao.executeBar(barHint);
}
void persist(OrderBag bag) {
RemoveOrderLineHint hint = dirtyMemento.firstHintOf(RemoveOrderLineHint.class);
dao.batchUpdate(hint);
}
}
class OrderBag implements IBag {
private DirtyMemento dirtyMemento;
public void removeOrderLine(OrderLine orderLine) {
// ...
dirtyMemento.register(new RemoveOrderLineHint(orderLine));
}
}
构造器和说明 |
---|
DirtyMemento() |
限定符和类型 | 方法和说明 |
---|---|
void |
clear() |
List<IDirtyHint> |
dirtyHints()
当前的所有脏数据.
|
<T extends IDirtyHint> |
dirtyHintsOf(Class<T> hintClass)
根据指定hint class type,找到其所有的脏数据通知.
|
<T extends IDirtyHint> |
firstHintOf(Class<T> hintClass)
根据指定hint class type,找到已经注册的第一个脏数据通知.
|
boolean |
isEmpty() |
void |
merge(@NonNull IMergeAwareDirtyHint hint)
合并脏数据通知:如未注册则注册,否则与现有那一个hint合并.
|
void |
register(@NonNull IDirtyHint hint)
注册(追加)一个脏数据通知,以便
Repository 知道具体如何持久化. |
int |
size() |
public void register(@NonNull @NonNull IDirtyHint hint)
Repository
知道具体如何持久化.hint
- the dirty hint with necessary datapublic void merge(@NonNull @NonNull IMergeAwareDirtyHint hint)
保证备忘录里,该IMergeAwareDirtyHint
只保留一个
Merge on Write
hint
- 脏数据通知public List<IDirtyHint> dirtyHints()
public void clear()
public boolean isEmpty()
public int size()
public <T extends IDirtyHint> T firstHintOf(Class<T> hintClass)
T
- hint class typehintClass
- concrete type of IDirtyHint
@NonNull public <T extends IDirtyHint> @NonNull List<T> dirtyHintsOf(Class<T> hintClass)
T
- hint class typehintClass
- concrete type of IDirtyHint
Copyright © 2020–2023. All rights reserved.