9

asp.net アプリケーションで使用しているクラス ライブラリにキャッシュを実装しています。

キャッシュを更新するための静的メソッドを使用して、シングルトン パターンとしてキャッシュ オブジェクトを作成しました。これは、キャッシュする必要があるデータのコレクションをメンバー変数/プロパティにロードするだけです (もちろん、いくつかのロック ロジックを取得しました)。呼び出すだけでデータにアクセスできるので、これは良い方法だと思いました

MyCacheObject.Instance.MyDataCollection

いくつかのキーで分割された大量のデータを格納するために、新しいキャッシュ オブジェクトを作成しています。私が言っているのは、新しいキャッシュを作成しているということですが、これはすべてのデータを一度にロードするのではなく、アクセスされたキーごとにコレクションを保存します。

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

今回はガベージコレクションについての質問が持ち上がりました。大量のデータを保存しているので、いきなりGCされたらもったいないですよね?これは単なるシングルトン パターンであるため、データがキャッシュに保持されることを保証するものは何もありません。

だから私の質問は - この状況を処理するためにキャッシュを実装するためのベストプラクティスは何ですか? 私はこれに対する非常に複雑なソリューションが本当に好きではありません.System.Webにキャッシュがあることは知っていますが、これは単なるクラスライブラリであるため、少し「ずれている」ようです.

4

2 に答える 2

9

私の意見では、最良のソリューションには次の特徴があります。

  • 独自の記述を避けるために、プラットフォームが提供する利用可能なキャッシュ サービスを使用します。

  • レイヤーを一貫させるために、クラス ライブラリを System.Web に結合しません。

  • ただし、クラス ライブラリが ASP.NET アプリケーション内で実行されている場合、ソリューションでは別のキャッシュ実装 (たとえば、エンタープライズ ライブラリ キャッシュ アプリケーション ブロック) を導入する必要はありません。これには、追加の構成とセットアップが必要です。

そのため、実行中の環境に基づいて、クラス ライブラリがさまざまなキャッシュ実装を使用できるようにするために、IoC 戦略を使用します。

抽象キャッシュ コントラクトを次のように定義するとします。

public interface ICacheService 
{
    AddItem(...);
}

System.Web に基づく実装を提供できます。

public AspNetBasedCacheService : ICacheService
{
    AddItem(...)
    {
        // Implementation that uses the HttpContext.Cache object
    }
 }

そして、その実装をシングルトンとして「公開」します。元のアプローチとの違いは、シングルトンが完全な「キャッシュ オブジェクト」ではなく、ASP.NET キャッシュ サービス ベースの実装への単なる参照であることに注意してください。

public class CacheServiceProvider 
{
    public static ICacheService Instance {get; set;}

}

遅延初期化を実行するか、アプリケーションの起動時に ( でGlobal.asax.cs)キャッシングの実装を初期化する必要があります。

また、すべてのドメイン コンポーネントは、System.Web に基づいて実装されていることを知らなくても、公開されたキャッシュ サービスを使用できます。

// inside your class library:
ICacheService cache = CacheServiceProvider.Instance;
cache.AddItem(...);

おそらく最も単純なソリューションではないことに同意しますが、コードの分離と柔軟性を犠牲にすることなく、ASP.NET キャッシュの実装を利用することを目指しています。

あなたの質問が正しく理解できたことを願っています。

于 2008-10-01T06:59:10.850 に答える
1

キャッシュがまだデータへの参照を保持している限り、データはガベージ コレクションされません。

また、シングルトンを使用しないでください。

于 2008-10-01T06:40:51.363 に答える