У меня есть приложение, которое пытается следовать чистой архитектуре, и мне нужно сделать некоторую недействительность кеша, но я не знаю, на каком уровне это должно быть сделано.
Для этого примера предположим, что у меня есть OrderInteractor
с двумя вариантами использования: getOrderHistory()
и sendOrder(Order)
.
В первом варианте использования используется 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
(хотя я думаю, что последнее лучше, потому что снова взаимодействующий, вероятно, не должен знать, что есть какой-то кеш управление под капотом).
Какой способ построения архитектуры вы бы предпочли?
Большое тебе спасибо. Пьер
InternetOrder*Repository
. Подумайте об этом:InternetOrderHistoryRepository
также использует кеш, но также скрывает его. - person John McFo   schedule 07.04.2017