7

クリーン アーキテクチャに従おうとするアプリがあり、キャッシュの無効化を行う必要がありますが、どのレイヤーでこれを行うべきかわかりません。

この例のために、と のOrderInteractor2 つのユース ケースがあるgetOrderHistory()としsendOrder(Order)ます。

最初の使用例は を使用してOrderHistoryRepositoryおり、2 番目の使用例は を使用していOrderSenderRepositoryます。これらのリポジトリは、複数の実装 (MockOrderHistoryRepositoryおよびInternetOrderHistoryRepository最初の実装) とのインターフェイスです。OrderInteractor実際の実装を隠すために、インターフェイスを介してこれらのリポジトリとのみ対話します。

Mockバージョンは非常にダミーですが、履歴リポジトリのバージョンInternetは、パフォーマンスを向上させるために一部のデータをキャッシュに保持しています。

今、私は次のことを実装したいと考えています: 注文が正常に送信されたら、履歴のキャッシュを無効にしたいのですが、実際のキャッシュの無効化をどこで実行する必要があるのか​​ わかりません。

invalidateCache()私の最初の推測は、 に aを追加し、このメソッドをインタラクター内のメソッドOrderHistoryRepositoryの最後で使用することです。sendOrder()ではInternetOrderHistoryRepository、キャッシュの無効化を実装するだけで十分です。しかし、私は実際にメソッドを内部に実装することを余儀なくされ、MockOrderHistoryRepository一部のキャッシュ管理がリポジトリによって実行されているという事実を外部に公開しています。のバージョンのOrderInteractor実装詳細なので、このキャッシュ管理は意識しなくていいと思います。InternetOrderHistoryRepository

私の2番目の推測はInternetOrderSenderRepository、注文が正常に送信されたことを知っているときに内部でキャッシュの無効化を実行することですInternetOrderHistoryRepositoryが、キャッシュ管理のためにこのリポジトリで使用されるキャッシュキーを取得するために、このリポジトリに を強制的に認識させます。OrderSenderRepositoryそして、私は私のものとの依存関係を持ちたくありませんOrderHistoryRepository

最後に、私の 3 番目の推測は、リポジトリがモックされたときに使用される実装と、リポジトリが使用されているときの実装を備えた、ある種のCacheInvalidator(名前が何であれ) インターフェースを持つことです。これは に注入され、選択された実装は、リポジトリを構築している とによって提供されます。これは、 と を構築している - と と を構築している - を持つことを意味します。しかし、ここでも、これを の最後に使用するか、直接使用するかはわかりません。DummyRealInteractorInternetCacheInvalidatorInteractorFactoryCacheInvalidatorMockedOrderHistoryRepositoryFactoryMockedOrderHistoryRepositoryDummyCacheInvalidatorInternetOrderHistoryRepositoryFactoryInternetOrderHistoryRepositoryRealCacheInvalidatorCacheInvalidatorInteractorsendOrder()InternetOrderSenderRepository(インタラクターは内部にキャッシュ管理があることをおそらく知らないはずなので、後者の方が優れていると思いますが)。

これを構築するためのあなたの好みの方法は何ですか?

どうもありがとうございました。ピエール

4

1 に答える 1