アーキテクチャでデータをキャッシュする (C#)

作成者: Scott Mitchell

PDF のダウンロード

前のチュートリアルでは、プレゼンテーション層でキャッシュを適用する方法を学習しました。 このチュートリアルでは、階層化アーキテクチャを利用してビジネス ロジック層でデータをキャッシュする方法について説明します。 これを行うには、アーキテクチャを拡張してキャッシュ層を含めます。

はじめに

前のチュートリアルで説明したように、ObjectDataSource のデータのキャッシュは、いくつかのプロパティを設定するのと同じくらい簡単です。 残念ながら、ObjectDataSource はプレゼンテーション層でキャッシュを適用します。これにより、キャッシュ ポリシーと ASP.NET ページが密接に結合されます。 階層化アーキテクチャを作成する理由の 1 つは、このような結合を切ることができるようにすることです。 たとえば、ビジネス ロジック層は ASP.NET ページからビジネス ロジックを切り離し、データ アクセス層はデータ アクセスの詳細を切り離します。 このビジネス ロジックとデータ アクセスの詳細の切り離しによってシステムの読み取り、保守性、変更の柔軟性が高まるため、推奨されます。 また、それによりドメイン知識および労働の役割分担が考慮され、プレゼンテーション層で作業する開発者が自分の仕事をするためにデータベースの詳細を知る必要がありません。 プレゼンテーション層からキャッシュ ポリシーを切り離す場合も、同様の利点があります。

このチュートリアルでは、キャッシュ ポリシーを使用する "キャッシュ層" (または略して CL) を含むようにアーキテクチャを拡張します。 キャッシュ層には、呼び出されたときに最初にキャッシュからデータを取得しようとする GetProducts()GetProductsByCategoryID(categoryID) などのメソッドを使用して製品情報へのアクセスを提供する ProductsCL クラスが含まれます。 キャッシュが空の場合、これらのメソッドは BLL で適切な ProductsBLL メソッドを呼び出します。これにより、DAL からデータが取得されます。 ProductsCL メソッドは、BLL から取得したデータを返す前にキャッシュします。

図 1 に示すように、CL はプレゼンテーション層とビジネス ロジック層の間に存在します。

The Caching Layer (CL) is Another Layer in Our Architecture

図 1: キャッシュ 層 (CL) はアーキテクチャのもう 1 つのレイヤー

手順 1: キャッシュ層のクラスを作成する

このチュートリアルでは、少数のメソッドしかない 1 つのクラスの ProductsCL を使用して非常に単純な CL を作成します。 アプリケーション全体に対して完全なキャッシュ層を構築するには、CategoriesCLEmployeesCLSuppliersCL クラスを作成し、BLL でのデータ アクセスまたは変更メソッドごとに、これらのキャッシュ層クラスにメソッドを提供する必要があります。 BLL と DAL と同様に、キャッシュ層は個別のクラス ライブラリ プロジェクトとして実装することが理想的です。ただし、ここでは App_Code フォルダー内のクラスとして実装します。

CL クラスを DAL および BLL クラスから明確に分けるために、App_Code フォルダーに新しいサブフォルダーを作成します。 ソリューション エクスプローラーで App_Code フォルダーを右クリックし、[新しいフォルダー] を選択し、新しいフォルダーに CL という名前を付けます。 このフォルダーを作成した後、そのフォルダーに ProductsCL.cs という名前の新しいクラスを追加します。

Add a New Folder Named CL and a Class Named ProductsCL.cs

図 2: CL という名前の新しいフォルダーと ProductsCL.cs という名前のクラスを追加する

ProductsCL クラスには、対応するビジネス ロジック層のクラス (ProductsBLL) と同じデータ アクセスおよび変更メソッドのセットを含める必要があります。 これらのメソッドをすべて作成するのではなく、CL で使用されるパターンの感覚をつかむために、ここでいくつかのメソッドを作成しましょう。 特に、手順 3 の GetProducts() および GetProductsByCategoryID(categoryID) メソッドと手順 4 の UpdateProduct オーバーロードを追加します。 残りの ProductsCL メソッドと CategoriesCLEmployeesCLSuppliersCL クラスを自由に追加できます。

手順 2: データ キャッシュの読み取りと書き込み

前のチュートリアルで説明した ObjectDataSource キャッシュ機能は、ASP.NET データ キャッシュを内部的に使用して、BLL から取得したデータを格納します。 データ キャッシュには、ASP.NET ページの分離コード クラスまたは Web アプリケーションのアーキテクチャ内のクラスからプログラムでアクセスすることもできます。 ASP.NET ページの分離コード クラスからデータ キャッシュの読み取りと書き込みを行うには、次のパターンを使用します。

// Read from the cache
object value = Cache["key"];
// Add a new item to the cache
Cache["key"] = value;
Cache.Insert(key, value);
Cache.Insert(key, value, CacheDependency);
Cache.Insert(key, value, CacheDependency, DateTime, TimeSpan);

Cache クラスInsert メソッドには、いくつかのオーバーロードがあります。 Cache["key"] = valueCache.Insert(key, value) は同義であり、両方とも、定義された有効期限なしで指定されたキーを使用してキャッシュに項目を追加します。 通常は、依存関係、時間ベースの有効期限、またはその両方として、項目をキャッシュに追加するときに有効期限を指定します。 依存関係または時間ベースの有効期限情報を提供するには、他の Insert メソッドのオーバーロードのいずれかを使用します。

キャッシュ層のメソッドでは、要求されたデータがキャッシュ内にある場合は最初にチェックし、存在する場合はそこから返す必要があります。 要求されたデータがキャッシュにない場合は、適切な BLL メソッドを呼び出す必要があります。 次のシーケンス図に示すように、戻り値をキャッシュしてから返す必要があります。

The Caching Layer s Methods Return Data from the Cache if it s Available

図 3: キャッシュ層のメソッドは、キャッシュからデータを返す (使用可能な場合)

図 3 に示すシーケンスは、CL クラスで次のパターンを使用して実現されます。

Type instance = Cache["key"] as Type;
if (instance == null)
{
    instance = BllMethodToGetInstance();
    Cache.Insert(key, instance, ...);
}
return instance;

ここで、Type はキャッシュ Northwind.ProductsDataTable に格納されるデータの種類です。たとえば、key はキャッシュ項目を一意に識別するキーです。 指定した key を持つ項目がキャッシュ内にない場合、instancenull で、データは適切な BLL メソッドから取得され、キャッシュに追加されます。 return instance に到達するまでに、instance にはキャッシュからの、または BLL からプルされたデータへの参照が含まれます。

キャッシュからのデータにアクセスするときは、必ず上記のパターンを使用してください。 次のパターンは、一見すると同等に見えますが、競合状態を引き起こす微妙な違いが含まれています。 競合状態は散発的に現れ、再現が困難なためデバッグが困難です。

if (Cache["key"] == null)
{
    Cache.Insert(key, BllMethodToGetInstance(), ...);
}
return Cache["key"];

この 2 つ目の正しくないコード スニペットの相違点は、キャッシュされた項目への参照をローカル変数に格納するのではなく、条件付きステートメント "" return でデータ キャッシュに直接アクセスしているところです。 このコードに到達したときに、Cache["key"]null 以外で、return ステートメントに到達する前に、システムによってキャッシュから key が削除されることを考えてみてください。 このまれなケースでは、想定される型のオブジェクトではなく、null 値がコードによって返されます。

Note

データ キャッシュはスレッド セーフであるため、単純な読み取りまたは書き込みのためにスレッド アクセスを同期する必要はありません。 ただし、アトミックである必要があるキャッシュ内のデータに対して複数の操作を実行する必要がある場合は、スレッド セーフを確保するためのロックまたはその他のメカニズムを実装する必要があります。 詳細については、「ASP.NET キャッシュへのアクセスの同期」を参照してください。

項目は、次のような Remove メソッドを使用して、プログラムによってデータ キャッシュから削除できます。

Cache.Remove(key);

手順 3: ProductsCL クラスから製品情報を返す

このチュートリアルでは、ProductsCL クラスの GetProducts()GetProductsByCategoryID(categoryID) から製品情報を返す 2 つのメソッドを実装してみましょう。 ビジネス ロジック層の ProductsBL クラスと同様に、CL 内の GetProducts() メソッドでは Northwind.ProductsDataTable オブジェクトとしてすべての製品に関する情報を返し、GetProductsByCategoryID(categoryID) では指定したカテゴリのすべての製品を返します。

次のコードは、ProductsCL クラス内のメソッドの一部を示しています。

[System.ComponentModel.DataObject]
public class ProductsCL
{
    private ProductsBLL _productsAPI = null;
    protected ProductsBLL API
    {
        get
        {
            if (_productsAPI == null)
                _productsAPI = new ProductsBLL();
            return _productsAPI;
        }
    }
    
   [System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public Northwind.ProductsDataTable GetProducts()
    {
        const string rawKey = "Products";
        // See if the item is in the cache
        Northwind.ProductsDataTable products = _
            GetCacheItem(rawKey) as Northwind.ProductsDataTable;
        if (products == null)
        {
            // Item not found in cache - retrieve it and insert it into the cache
            products = API.GetProducts();
            AddCacheItem(rawKey, products);
        }
        return products;
    }
    
    [System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductsByCategoryID(int categoryID)
    {
        if (categoryID < 0)
            return GetProducts();
        else
        {
            string rawKey = string.Concat("ProductsByCategory-", categoryID);
            // See if the item is in the cache
            Northwind.ProductsDataTable products = _
                GetCacheItem(rawKey) as Northwind.ProductsDataTable;
            if (products == null)
            {
                // Item not found in cache - retrieve it and insert it into the cache
                products = API.GetProductsByCategoryID(categoryID);
                AddCacheItem(rawKey, products);
            }
            return products;
        }
    }
}

まず、クラスとメソッドに適用される DataObject および DataObjectMethodAttribute 属性をメモします。 これらの属性は、ObjectDataSource のウィザードに情報を提供し、ウィザードの手順で表示するクラスとメソッドを示します。 CL クラスとメソッドはプレゼンテーション層の ObjectDataSource からアクセスされるため、デザイン時のエクスペリエンスを向上させるためにこれらの属性を追加しました。 これらの属性とその効果について詳しくは、「ビジネス ロジック層を作成する」チュートリアルをご覧ください。

GetProducts() および GetProductsByCategoryID(categoryID) メソッドでは、GetCacheItem(key) メソッドから返されたデータがローカル変数に代入されます。 GetCacheItem(key) メソッド (これから説明します) は、指定した key に基づいてキャッシュから特定の項目を返します。 キャッシュにそのようなデータが見つからない場合は、対応する ProductsBLL クラス メソッドから取得され、AddCacheItem(key, value) メソッドを使用してキャッシュに追加されます。

GetCacheItem(key) および AddCacheItem(key, value) メソッドは、それぞれデータ キャッシュとやり取りし、値の読み取りと書き込みを行います。 2 つのうち、この GetCacheItem(key) メソッドの方が簡単です。 渡された key を使用して Cache クラスからの値を返すだけです。

private object GetCacheItem(string rawKey)
{
    return HttpRuntime.Cache[GetCacheKey(rawKey)];
}
private readonly string[] MasterCacheKeyArray = {"ProductsCache"};
private string GetCacheKey(string cacheKey)
{
    return string.Concat(MasterCacheKeyArray[0], "-", cacheKey);
}

GetCacheItem(key) は指定された key 値を使用しません。代わりに GetCacheKey(key) メソッドを呼び出します。これは ProductsCache- で始まる key を返します。 文字列 ProductsCache を保持する MasterCacheKeyArray は、AddCacheItem(key, value) メソッドでも使用されます。これはすぐに説明します。

ASP.NET ページの分離コード クラスから、Page クラスの Cache プロパティを使用してデータ キャッシュにアクセスでき、手順 2 で説明したように Cache["key"] = value などの構文を使用できます。 アーキテクチャ内のクラスから、HttpRuntime.Cache または HttpContext.Current.Cache のいずれかを使用してデータ キャッシュにアクセスできます。 Peter Johnson のブログ エントリ「HttpRuntime.Cache vs.HttpContext.Current.Cache」では、HttpContext.Current ではなく HttpRuntime を使用する場合のパフォーマンス上のわずかな利点について記述しています。したがって、ProductsCL では HttpRuntime が使用されます。

Note

クラス ライブラリ プロジェクトを使用してアーキテクチャが実装されている場合は、HttpRuntime および HttpContext クラスを使用するために System.Web アセンブリへの参照を追加する必要があります。

項目がキャッシュに見つからない場合、ProductsCL クラスのメソッドは BLL からデータを取得し、AddCacheItem(key, value) メソッドを使用してキャッシュに追加します。 キャッシュに value を追加するには、60 秒の有効期限を使用する次のコードを使用できます。

const double CacheDuration = 60.0;
private void AddCacheItem(string rawKey, object value)
{
    HttpRuntime.Cache.Insert(GetCacheKey(rawKey), value, null, 
        DateTime.Now.AddSeconds(CacheDuration), Caching.Cache.NoSlidingExpiration);
}

DateTime.Now.AddSeconds(CacheDuration) は、今後 60 秒の時間ベースの有効期限を指定し、System.Web.Caching.Cache.NoSlidingExpiration はスライド式有効期限がないことを示します。 この Insert メソッドのオーバーロードには絶対およびスライド式有効期限の両方の入力パラメーターが含まれていますが、指定できるのは 2 つのうちの 1 つだけです。 絶対時間と期間の両方を指定しようとすると、Insert メソッドによって ArgumentException 例外がスローされます。

Note

この AddCacheItem(key, value) メソッドの実装には現在、いくつかの欠点があります。 手順 4 でこれらの問題に対処し、解決します。

手順 4: アーキテクチャを通じてデータが変更されたときにキャッシュを無効にする

データ取得メソッドと共に、キャッシュ層では、データの挿入、更新、および削除のために BLL と同じメソッドを提供する必要があります。 CL のデータ変更メソッドは、キャッシュされたデータを変更するのではなく、データ変更メソッドに対応する BLL を呼び出してキャッシュを無効にします。 前のチュートリアルで説明したように、これは、ObjectDataSource がそのキャッシュ機能を有効にして、その InsertUpdate、または Delete メソッドが呼び出されたときに適用されるのと同じ動作です。

次の UpdateProduct オーバーロードは、CL でデータ変更メソッドを実装する方法を示しています。

[System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, int productID)
{
    bool result = API.UpdateProduct(productName, unitPrice, productID);
    // TODO: Invalidate the cache
    return result;
}

ビジネス ロジック層の適切なデータ変更メソッドが呼び出されますが、応答が返される前にキャッシュを無効にする必要があります。 残念ながら、ProductsCL クラスの GetProducts()GetProductsByCategoryID(categoryID) メソッドはそれぞれ異なるキーを使用して項目をキャッシュに追加し、GetProductsByCategoryID(categoryID) メソッドは一意の categoryID ごとに異なるキャッシュ項目を追加するため、キャッシュの無効化は簡単ではありません。

キャッシュを無効にする場合は、ProductsCL クラスによって追加された "すべて" の項目を削除する必要があります。 これは、"キャッシュの依存関係" を、AddCacheItem(key, value) メソッド内のキャッシュに追加された各項目に関連付けることによって実現できます。 一般に、キャッシュの依存関係には、キャッシュ内の別の項目、ファイル システム上のファイル、または Microsoft SQL Server データベースのデータを指定できます。 依存関係が変わるか、キャッシュから削除されると、関連付けられているキャッシュ項目はキャッシュから自動的に削除されます。 このチュートリアルでは、ProductsCL クラスを介して追加されたすべての項目のキャッシュ依存関係として機能する追加の項目をキャッシュに作成します。 これにより、キャッシュの依存関係を削除するだけで、これらの項目をすべてキャッシュから削除できます。

AddCacheItem(key, value) メソッドを更新して、このメソッドを使用してキャッシュに追加された各項目が 1 つのキャッシュ依存関係に関連付けられるようにしましょう。

private void AddCacheItem(string rawKey, object value)
{
    System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
    // Make sure MasterCacheKeyArray[0] is in the cache - if not, add it
    if (DataCache[MasterCacheKeyArray[0]] == null)
        DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
    // Add a CacheDependency
    System.Web.Caching.CacheDependency dependency = 
        new CacheDependency(null, MasterCacheKeyArray);
    DataCache.Insert(GetCacheKey(rawKey), value, dependency, 
        DateTime.Now.AddSeconds(CacheDuration), 
        System.Web.Caching.Cache.NoSlidingExpiration);
}

MasterCacheKeyArray は、1 つの値 ProductsCache を保持する文字列配列です。 最初に、キャッシュ項目がキャッシュに追加され、現在の日付と時刻が割り当てられます。 キャッシュ項目が既に存在する場合は、更新されます。 次に、キャッシュの依存関係が作成されます。 CacheDependency クラスのコンストラクターにはいくつかのオーバーロードがありますが、ここで使用されているオーバーロードには 2 つの string 配列入力が必要です。 1 つ目では、依存関係として使用するファイルのセットを指定します。 ファイル ベースの依存関係を使用したくないので、最初の入力パラメーターには null の値が使用されます。 2 つ目の入力パラメーターでは、依存関係として使用するキャッシュ キーのセットを指定します。 ここでは、単一の依存関係の MasterCacheKeyArray を指定します。 その後、CacheDependencyInsert メソッドに渡されます。

この AddCacheItem(key, value) に対する変更を使用すると、キャッシュを無効にするのは、依存関係を削除するのと同じくらい簡単です。

[System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, int productID)
{
    bool result = API.UpdateProduct(productName, unitPrice, productID);
    // Invalidate the cache
    InvalidateCache();
    return result;
}
public void InvalidateCache()
{
    // Remove the cache dependency
    HttpRuntime.Cache.Remove(MasterCacheKeyArray[0]);
}

手順 5: プレゼンテーション層からキャッシュ層を呼び出す

キャッシュ層のクラスとメソッドは、これらのチュートリアルで確認した手法を使用してデータを操作するために使用できます。 キャッシュされたデータの操作を説明するには、変更を ProductsCL クラスに保存し、Caching フォルダーの FromTheArchitecture.aspx ページを開き、GridView を追加します。 次に、GridView のスマート タグから新しい ObjectDataSource を作成します。 ウィザードの最初の手順では、ドロップダウン リストのオプションの 1 つとして ProductsCL クラスが表示されます。

The ProductsCL Class is Included in the Business Object Drop-Down List

図 4: ProductsCL クラスがビジネス オブジェクトのドロップダウン リストに含まれている (クリックするとフルサイズの画像が表示されます)

ProductsCL を選択した後、[次へ] をクリックします。 [SELECT] タブのドロップダウン リストには、GetProducts()GetProductsByCategoryID(categoryID) の 2 つの項目があり、[UPDATE] タブには唯一の UpdateProduct オーバーロードがあります。 [SELECT] タブから GetProducts() メソッドを選択し、[UPDATE] タブから UpdateProducts メソッドを選択して、[完了] をクリックします。

The ProductsCL Class s Methods are Listed in the Drop-Down Lists

図 5: ProductsCL クラスのメソッドがドロップダウン リストに一覧表示されている (クリックするとフルサイズの画像が表示されます)。

ウィザードが完了すると、Visual Studio によって ObjectDataSource の OldValuesParameterFormatString プロパティが original_{0} に設定され、適切なフィールドが GridView に追加されます。 OldValuesParameterFormatString プロパティを既定値 {0} に戻し、ページング、並べ替え、編集をサポートするように GridView を構成します。 CL によって使用される UploadProducts オーバーロードは、編集された製品の名前と価格のみを受け入れるので、これらのフィールドのみが編集可能になるように GridView を制限します。

前のチュートリアルでは、ProductNameCategoryName、および UnitPrice フィールドのフィールドを含めるように GridView を定義しました。 この書式設定と構造を自由にレプリケートできます。その場合、GridView と ObjectDataSource の宣言型マークアップは次のようになります。

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
    AllowPaging="True" AllowSorting="True">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:TemplateField HeaderText="Product" SortExpression="ProductName">
            <EditItemTemplate>
                <asp:TextBox ID="ProductName" runat="server" 
                    Text='<%# Bind("ProductName") %>' />
                <asp:RequiredFieldValidator ID="RequiredFieldValidator1"
                    ControlToValidate="ProductName" Display="Dynamic" 
                    ErrorMessage="You must provide a name for the product." 
                    SetFocusOnError="True"
                    runat="server">*</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" 
                    Text='<%# Bind("ProductName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
            <EditItemTemplate>
                $<asp:TextBox ID="UnitPrice" runat="server" Columns="8" 
                    Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
                <asp:CompareValidator ID="CompareValidator1" runat="server" 
                    ControlToValidate="UnitPrice" Display="Dynamic" 
                    ErrorMessage="You must enter a valid currency value with 
                        no currency symbols. Also, the value must be greater than 
                        or equal to zero."
                    Operator="GreaterThanEqual" SetFocusOnError="True" 
                    Type="Currency" ValueToCompare="0">*</asp:CompareValidator>
            </EditItemTemplate>
            <ItemStyle HorizontalAlign="Right" />
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" 
                    Text='<%# Bind("UnitPrice", "{0:c}") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" 
    TypeName="ProductsCL" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

この時点で、キャッシュ層を使用するページができます。 キャッシュの動作を確認するには、ProductsCL クラスの GetProducts()UpdateProduct メソッドにブレークポイントを設定します。 ブラウザーでページにアクセスし、キャッシュからプルされたデータを表示するために、並べ替えとページングを行うときにコードをステップ実行します。 次に、レコードを更新し、キャッシュが無効になっていることに注意してください。結果として、データが GridView に再バインドされたときに BLL から取得されます。

Note

この記事に付属するダウンロードで提供されているキャッシュ層は完全ではありません。 これには 1 つのクラス ProductsCL のみが含まれています。これには、少数のメソッドしかありません。 さらに、CL (~/Caching/FromTheArchitecture.aspx) を使用する ASP.NET ページは 1 つだけです。それ以外はすべて BLL を直接参照します。 アプリケーションで CL を使用する予定の場合、プレゼンテーション層からのすべての呼び出しは CL に行く必要があります。そのためには、CL のクラスとメソッドが、プレゼンテーション層で現在使用されている BLL のクラスとメソッドを持っている必要があります。

まとめ

キャッシュは、ASP.NET 2.0 の SqlDataSource と ObjectDataSource コントロールを使用してプレゼンテーション層で適用できますが、キャッシュの役割はアーキテクチャの個別のレイヤーに委任するのが理想的です。 このチュートリアルでは、プレゼンテーション層とビジネス ロジック層の間にあるキャッシュ層を作成しました。 キャッシュ層には、BLL に存在し、プレゼンテーション層から呼び出されるクラスとメソッドと同じセットが用意される必要があります。

このチュートリアルで説明したキャッシュ層の例と前のチュートリアルで、"リアクティブな読み込み" について説明しました。 リアクティブな読み込みでは、データの要求が行われ、そのデータがキャッシュに存在しない場合にのみデータがキャッシュに読み込まれます。 データはキャッシュに "プロアクティブに読み込む" こともできます。これは、実際に必要になる前にデータをキャッシュに読み込む手法です。 次のチュートリアルでは、アプリケーションの起動時に静的な値をキャッシュに格納する方法を確認するときの、プロアクティブな読み込みの例を確認します。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジに取り組んでいます。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、Teresa Murph でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。