2017-02-13 4 views
0

私は外部APIにアクセスするいくつかのサービスを作成したいと思います。そのサービス内のAPIからの共通要求をキャッシュしたいと思っています。それは3つの他のサービスに依存しますが、キャッシュは、MemoryDistributedCacheが後で他の何か私のコントローラから今正しいaspnetcoreの方法ですか?サービスと依存性注入

services.AddSingleton<ISomeApi, SomeApi>(provider => new SomeApi(
    Configuration.Get<Options>(), 
    new MemoryDistributedCache(new MemoryCache(new MemoryCacheOptions())), 
    provider.GetService<ILogger<SomeApi>>() 
    )); 

私はDI経由でAPIにアクセスできるために変更される可能性があります、それはうまく動作しますが、より良いアンチパターンの場合、またはそのいくつかの並べ替えがある場合イムわかりませんそれを行う方法

実際の問題は内部キャッシュを分離していることを意味し、 IDistributedMemoryを1つのサービスからリクエストしていますw他のサービスから要求した場合と同じオブジェクトを私に与えてください。それらは分離する必要があります。

+1

なぜ別のキャッシュにする必要がありますか?また、注記:GetService ()は、サービスが見つからない場合はnullを返します。だからあなたのサービスが実際にロガーを必要とするなら、 'GetRequiredService ()'を使ってください。 – juunas

+0

は、1つのキャッシュが1つのデータベースシステムによってバックアップされ、2番目のキャッシュが別のデータベースシステムによってバックアップされているとします – gdpm

答えて

1

これは、プロキシやデコレータパターンを使用できるようなものです。基本的な問題は、データアクセスを行うサービスと、最初のサービスの結果をキャッシュする別のサービスがあることです。私はあなたがリポジトリを使用していないことに気づいていますが、にもかかわらず、CachedRepositoryパターンは必要に応じて機能するはずです。ここを参照してください:

http://ardalis.com/introducing-the-cachedrepository-patternhttp://ardalis.com/building-a-cachedrepository-via-strategy-pattern

あなたは柔軟に設計の一部を必要としない場合には、そのコンストラクタで実際のSomeApiタイプに取るようなあなたのキャッシュされた実装を書くことができます。