我有一个尝试遵循清洁架构的应用程序,我需要做一些缓存失效,但我不知道应该在哪一层完成。
为了这个例子,假设我有OrderInteractor2 个用例: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实现。这将被注入到,并且选定的实现将由正在构建存储库和. 这意味着我将有一个- 正在构建和- 并且- 正在构建和。但是在这里,我不知道这应该由末尾使用还是直接由InteractorInternetCacheInvalidatorInteractorFactoryCacheInvalidatorMockedOrderHistoryRepositoryFactoryMockedOrderHistoryRepositoryDummyCacheInvalidatorInternetOrderHistoryRepositoryFactoryInternetOrderHistoryRepositoryRealCacheInvalidatorCacheInvalidatorInteractorsendOrder()InternetOrderSenderRepository(尽管我认为后者更好,因为交互者可能不应该知道引擎盖下有一些缓存管理)。
您首选的架构方式是什么?
非常感谢。皮埃尔