クリーン アーキテクチャに従おうとするアプリがあり、キャッシュの無効化を行う必要がありますが、どのレイヤーでこれを行うべきかわかりません。
この例のために、と のOrderInteractor
2 つのユース ケースがあるgetOrderHistory()
としsendOrder(Order)
ます。
最初の使用例は を使用してOrderHistoryRepository
おり、2 番目の使用例は を使用していOrderSenderRepository
ます。これらのリポジトリは、複数の実装 (MockOrderHistoryRepository
およびInternetOrderHistoryRepository
最初の実装) とのインターフェイスです。OrderInteractor
実際の実装を隠すために、インターフェイスを介してこれらのリポジトリとのみ対話します。
Mock
バージョンは非常にダミーですが、履歴リポジトリのバージョンInternet
は、パフォーマンスを向上させるために一部のデータをキャッシュに保持しています。
今、私は次のことを実装したいと考えています: 注文が正常に送信されたら、履歴のキャッシュを無効にしたいのですが、実際のキャッシュの無効化をどこで実行する必要があるのか わかりません。
invalidateCache()
私の最初の推測は、 に aを追加し、このメソッドをインタラクター内のメソッドOrderHistoryRepository
の最後で使用することです。sendOrder()
ではInternetOrderHistoryRepository
、キャッシュの無効化を実装するだけで十分です。しかし、私は実際にメソッドを内部に実装することを余儀なくされ、MockOrderHistoryRepository
一部のキャッシュ管理がリポジトリによって実行されているという事実を外部に公開しています。のバージョンのOrderInteractor
実装詳細なので、このキャッシュ管理は意識しなくていいと思います。Internet
OrderHistoryRepository
私の2番目の推測はInternetOrderSenderRepository
、注文が正常に送信されたことを知っているときに内部でキャッシュの無効化を実行することですInternetOrderHistoryRepository
が、キャッシュ管理のためにこのリポジトリで使用されるキャッシュキーを取得するために、このリポジトリに を強制的に認識させます。OrderSenderRepository
そして、私は私のものとの依存関係を持ちたくありませんOrderHistoryRepository
。
最後に、私の 3 番目の推測は、リポジトリがモックされたときに使用される実装と、リポジトリが使用されているときの実装を備えた、ある種のCacheInvalidator
(名前が何であれ) インターフェースを持つことです。これは に注入され、選択された実装は、リポジトリを構築している とによって提供されます。これは、 と を構築している - と と を構築している - を持つことを意味します。しかし、ここでも、これを の最後に使用するか、直接使用するかはわかりません。Dummy
Real
Interactor
Internet
CacheInvalidator
Interactor
Factory
CacheInvalidator
MockedOrderHistoryRepositoryFactory
MockedOrderHistoryRepository
DummyCacheInvalidator
InternetOrderHistoryRepositoryFactory
InternetOrderHistoryRepository
RealCacheInvalidator
CacheInvalidator
Interactor
sendOrder()
InternetOrderSenderRepository
(インタラクターは内部にキャッシュ管理があることをおそらく知らないはずなので、後者の方が優れていると思いますが)。
これを構築するためのあなたの好みの方法は何ですか?
どうもありがとうございました。ピエール