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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

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

キャッシュ レイヤー (CL) は、アーキテクチャのもう 1 つのレイヤーです

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

手順 1: キャッシュ レイヤー クラスの作成

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

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

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

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

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

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

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

キャッシュ レイヤーの メソッドは、キャッシュからデータを返します (使用可能な場合)。

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

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

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

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

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

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

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

注意

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

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

Cache.Remove(key);

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

このチュートリアルでは、 と クラス GetProducts()GetProductsByCategoryID(categoryID)から製品情報を返す 2 つのメソッドをProductsCL実装してみましょう。 ビジネス ロジック レイヤーの ProductsBL クラスと同様に、 GetProducts() CL の メソッドはオブジェクトとしてすべての製品に関する情報を 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;
        }
    }
}

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

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

メソッドと AddCacheItem(key, value) メソッドはGetCacheItem(key)、それぞれデータ キャッシュとインターフェイスし、値の読み取りと書き込みを行います。 メソッドは GetCacheItem(key) 、2 つのメソッドの方が簡単です。 渡された キーを使用して 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) は指定された キー 値を使用しませんが、 メソッドを GetCacheKey(key) 呼び出します。このメソッドは ProductsCache- で付加された キー を返します。 MasterCacheKeyArray文字列 ProductsCache を保持する は、 メソッドでも使用されますAddCacheItem(key, value)。一時的に表示されます。

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

注意

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

項目がキャッシュに見つからない場合、 ProductsCL クラスの メソッドは BLL からデータを取得し、 メソッドを使用してキャッシュに AddCacheItem(key, 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 されます。

注意

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

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

データ取得方法と共に、キャッシュ層は、データの挿入、更新、および削除のための BLL と同じメソッドを提供する必要があります。 CL s データ変更メソッドは、キャッシュされたデータを変更するのではなく、BLL s 対応するデータ変更メソッドを呼び出してキャッシュを無効にします。 前のチュートリアルで説明したように、これは ObjectDataSource がキャッシュ機能を有効にし、その Insertメソッド 、 Update、または 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;
}

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

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

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

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単一の依存関係 を指定します。 CacheDependency次に、 が メソッドにInsert渡されます。

にこの変更を 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保存し、フォルダー内のページをCachingFromTheArchitecture.aspx開き、GridView を追加します。 GridView のスマート タグから、新しい ObjectDataSource を作成します。 ウィザードの最初の手順では、ドロップダウン リストのオプションの 1 つとして クラスが表示 ProductsCL されます。

ProductsCL クラスがビジネス オブジェクト Drop-Down リストに含まれる

図 4: クラスが ProductsCL ビジネス オブジェクト Drop-Down リストに含まれています (フルサイズの画像を表示する をクリックします)

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

ProductsCL クラスのメソッドは、Drop-Down Lists に一覧表示されます。

図 5: クラスのメソッドはProductsCL、Drop-Down Lists に一覧表示されます (フルサイズの画像を表示する をクリックします)。

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

前のチュートリアルでは、および UnitPrice フィールドのフィールドを含むように GridView をProductNameCategoryName定義しました。 この書式設定と構造を自由にレプリケートできます。この場合、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>

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

注意

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

まとめ

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

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

幸せなプログラミング!

著者について

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

特別な感謝

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