[英]Clean Architecture - how to address database transactions?
在“干凈架構”中,交互者(用例)負責定義業務邏輯。 大多數示例以這種方式定義用例:
public MyUseCase() {
public boolean execute(...) {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
}
}
Interactors主要使用簡單的CRUD操作或存儲庫查詢。 上面的示例在簡單的情況下是同步的,但您可以使用異步解決方案(如回調或rxjava)以相同的方法找到repos。
但是用例不完整呢? 舉例來說,你不能100%肯定,在插入后a
它仍然會在那里,當你插入b
。 如果在插入之后插入b
會得到一些RepositoryException, a
怎么辦?
我到目前為止看到的所有回購都沒有考慮到,所以我的問題是:
清潔架構中上述問題的解決方案是什么?
這個答案可能有點晚了,但我一直在努力解決同樣的問題,並得出結論,事務管理實際上是用例的一部分 - 比如,“如果B出現問題,還原A的狀態”。 因此,它可以而且應該在您的UseCase中明確說明,可能使用某種“DataManagerRepo”,如下所示:
public MyUseCase() {
public boolean execute(...) {
dataManagerRepository.openTransaction()
try {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
catch (MyException exc) {
dataManagerRepository.rollbackTransaction()
}
dataManagerRepository.commitTransaction()
}
}
名稱可能會有所不同,以抽象出完整性機制,但這個想法是一樣的。 我希望這會對某人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.