さまざまなクライアントから大きなメッセージを受信するWCFサービスを作成しています。これらの各メッセージは、内部オブジェクトの多くが同一である可能性があるオブジェクトグラフで構成されています。私のサービスは、これらのメッセージのデータをメモリに保存します。
サービスのメモリ消費を最小限に抑えようとしています。そのため、ネットワークから受信した(オブジェクトグラフ内にネストされた)複数の同一オブジェクトではなく、単一のオブジェクトを格納したいと思います。
私はDataContractSerializerを使用しているので、最初に頭に浮かぶのはObject Graph Preservationオプションを使用することですpreserveObjectReferences
が、このアプローチにはいくつかの欠点があります。
- 他のテクノロジーとの相互運用性はありません(それが唯一の問題である場合、私はそれで生きることができます)。
- シリアル化と逆シリアル化のプロセスは遅くなります。
- オブジェクトが異なるメッセージ間で同一である場合、おそらく異なるクライアントからのものである場合、あまり役に立ちません。同じメッセージ内の同じオブジェクトグラフ上のオブジェクトにのみ適しています。
したがって、次に頭に浮かぶのは、ある種のキャッシュを使用することです。メッセージを受け取ったら、オブジェクトグラフをトラバースし、キャッシュを使用してすべての同一オブジェクトの単一インスタンスを見つけ、この単一インスタンスでストレージを更新できます。ストレージがそのオブジェクトへのすべての参照を破棄すると、キャッシュから削除され、そのオブジェクトのメモリが解放される可能性があります。
MemoryCacheを使用することはできますが、残念ながら、キーは文字列ではありません。キャッシュに保存するためだけに文字列に変換したくありません。(ObjectCacheを文字列キーに制限したとき、Microsoftはどう思いましたか?)
したがって、IEqualityComparerと比較できる弱参照とキーを使用してCacheクラスを書き直す前に、ここで何かが欠落していないことを確認したかったのです...
私の質問は次のとおりです。
- WCFサービスで重複したオブジェクトを処理(およびメモリに保存)するためのより良いアプローチはありますか?
- 書き直す代わりに使用できる優れた(効率的で一般的なオープンな)キャッシュ実装はありますか?