我有一个尝试遵循清洁架构的应用程序,我需要做一些缓存失效,但我不知道应该在哪一层完成。
为了这个例子,假设我有OrderInteractor
2 个用例:getOrderHistory()
和sendOrder(Order)
.
第一个用例使用 an OrderHistoryRepository
,第二个用例使用OrderSenderRepository
. 这些存储库是具有多种实现的接口(MockOrderHistoryRepository
以及InternetOrderHistoryRepository
第一个实现)。唯一通过接口与这些OrderInteractor
存储库交互以隐藏真正的实现。
该Mock
版本非常虚拟,但Internet
历史存储库的版本将一些数据保留在缓存中以更好地执行。
现在,我想实现以下内容:成功发送订单时,我想使历史缓存无效,但我不知道应该在哪里执行实际的缓存无效。
我的第一个猜测是在交互器内部的方法末尾添加一个invalidateCache()
并使用OrderHistoryRepository
此方法。sendOrder()
在 中InternetOrderHistoryRepository
,我只需要实现缓存失效,我会很好。但是我将被迫在内部实际实现该方法,MockOrderHistoryRepository
并且它向外部暴露了一些缓存管理是由存储库执行的事实。我认为OrderInteractor
不应该知道这个缓存管理,因为它Internet
是OrderHistoryRepository
.
我的第二个猜测是InternetOrderSenderRepository
当它知道订单已成功发送时执行缓存失效,但它将强制此存储库知道InternetOrderHistoryRepository
,以便获取此存储库用于缓存管理的缓存密钥。而且我不希望我OrderSenderRepository
对OrderHistoryRepository
.
最后,我的第三个猜测是有某种CacheInvalidator
(无论名称如何)接口,在模拟存储库时使用一个实现,在使用存储库时使用Dummy
一个Real
实现。这将被注入到,并且选定的实现将由正在构建存储库和. 这意味着我将有一个- 正在构建和- 并且- 正在构建和。但是在这里,我不知道这应该由末尾使用还是直接由Interactor
Internet
CacheInvalidator
Interactor
Factory
CacheInvalidator
MockedOrderHistoryRepositoryFactory
MockedOrderHistoryRepository
DummyCacheInvalidator
InternetOrderHistoryRepositoryFactory
InternetOrderHistoryRepository
RealCacheInvalidator
CacheInvalidator
Interactor
sendOrder()
InternetOrderSenderRepository
(尽管我认为后者更好,因为交互者可能不应该知道引擎盖下有一些缓存管理)。
您首选的架构方式是什么?
非常感谢。皮埃尔