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 IDirtyHintCopyright © 2020–2023. All rights reserved.