2017-02-14 10 views
1

最初の問題を理解する:Asp.netコア、私はいけない基本的な問題は、

services.AddMemoryCache(); // in Startup config 
public class AController 
{ 
public AController(IMemoryCache cacheA) { } 
} 

public class BController 
{ 
public BController(IMemoryCache cacheB) { } 
} 

問題ははCacheAがCacheBのと同じであるということである

私はプライベートAPIを持っているしたいと思います

(クラスタ接続)と公共API(フロントエンドに公開) どのようにDIパターンを親しみやすく保ちながらそれらを分けるか?

第2の問題。

iは、外部のサーバに照会HTTP を経由して、いくつかの外部のウェブサーバを要求し、その結果も、その後DBを照会ので、我々が最初なLocalCacheを問い合わせるDB に格納されているサービスにキャッシュされることになるサービスを持つようにしたい

そのサービスの結果はコントローラで使用され、フロントエンドに送信されます

どのようにすべてのファンシーasp.netcoreパターンでそのようなものを実装するには? キャッシュはONE(シングルトン)である必要がありますので、DBリクエストを無駄にする必要はありません。

?サービスとしてサービスを追加します.SCOPED <>それでは、すべてのインスタンスでキャッシュを同じに保つ方法(シングルトンDIか静的なMemoryCacheインスタンスか) 助けを乞う気がありません。

.js私は数分でそれをすべて行っているだろうが、そのマイクロソフトちょっと

+1

ソースで一つ見ては、あなたの質問のすべてに答えています:https://github.com/aspnet/Caching/blob/efbbdc5e0a8c8a664ea34cd41220d084b6906f57/src/Microsoft.Extensions.Caching.Memory/MemoryCacheServiceCollectionExtensions.cs#L76-L86 – Tseng

+0

VSの(Peek Definition - Alt F12)があなたにソースを見せてくれるのならいいでしょう。 – gdpm

答えて

1

は、2つのキャッシュ・インタフェースを定義します。

public interface IPrivateMemoryCache: IMemoryCache 
{ 
} 

public interface IPublicMemoryCache: IMemoryCache 
{ 
} 

public class AController 
{ 
    public AController(IPrivateMemoryCache cacheA) { } 
} 

public class BController 
{ 
    public BController(IPublicMemoryCache cacheB) { } 
} 

今すぐあなたのIoCコンテナに別のインスタンス化のルールを定義することができます。

+0

これは、両方のインタフェースが異なる契約を定義している場合、つまり言い換えれば、 'IMemoryCache'インターフェースは、[Liskov Substitution Principle](https://en.wikipedia.org/wiki/Liskov_substitution_principle)に違反します。 – Steven

+0

あなたがLSPを完全に入手しているとは思わないでください。データメンバーのデータ型や名前だけでなく、* behavioral *サブタイプ(例えば、[マーカーインターフェイス](https://en.wikipedia.org/wiki/Marker_interface_pattern)の使用について説明しています。 )のメンバーはすべて同じメンバーです)。デザインで独立したプライベートおよびパブリックキャッシュが必要な場合は、論理的に異なります。 –

+0

私はLSPをちゃんと理解していると思います。はい、あなたは正しいです、それは行動に関するものです。ここでの質問は、それらの実装が消費者の視点とは異なる動作をするかどうかということです。 – Steven