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

作成者: 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.vb という名前の新しいクラスを追加します。

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

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

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
Dim value as Object = 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 クラスで次のパターンを使用して実現されます。

Dim instance As Type = TryCast(Cache("key"), Type)
If instance Is Nothing Then
    instance = BllMethodToGetInstance()
    Cache.Insert(key, instance, ...)
End If
Return instance

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

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

If Cache("key") Is Nothing Then
    Cache.Insert(key, BllMethodToGetInstance(), ...)
End If
Return Cache("key")

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

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 _productsAPI As ProductsBLL = Nothing
    Protected ReadOnly Property API() As ProductsBLL
        Get
            If _productsAPI Is Nothing Then
                _productsAPI = New ProductsBLL()
            End If
            Return _productsAPI
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
    (DataObjectMethodType.Select, True)> _
    Public Function GetProducts() As Northwind.ProductsDataTable
        Const rawKey As String = "Products"
        ' See if the item is in the cache
        Dim products As Northwind.ProductsDataTable = _
            TryCast(GetCacheItem(rawKey), Northwind.ProductsDataTable)
        If products Is Nothing Then
            ' Item not found in cache - retrieve it and insert it into the cache
            products = API.GetProducts()
            AddCacheItem(rawKey, products)
        End If
        Return products
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (DataObjectMethodType.Select, False)> _
    Public Function GetProductsByCategoryID(ByVal categoryID As Integer) _
        As Northwind.ProductsDataTable
        If (categoryID < 0) Then
            Return GetProducts()
        Else
            Dim rawKey As String = String.Concat("ProductsByCategory-", categoryID)
            ' See if the item is in the cache
            Dim products As Northwind.ProductsDataTable = _
                TryCast(GetCacheItem(rawKey), Northwind.ProductsDataTable)
            If products Is Nothing Then
                ' Item not found in cache - retrieve it and insert it into the cache
                products = API.GetProductsByCategoryID(categoryID)
                AddCacheItem(rawKey, products)
            End If
            Return products
        End If
    End Function
End Class

まず、クラスとメソッドに適用される 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 Function GetCacheItem(ByVal rawKey As String) As Object
    Return HttpRuntime.Cache(GetCacheKey(rawKey))
End Function
Private ReadOnly MasterCacheKeyArray() As String = {"ProductsCache"}
Private Function GetCacheKey(ByVal cacheKey As String) As String
    Return String.Concat(MasterCacheKeyArray(0), "-", cacheKey)
End Function

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 と HttpContext.Current.Cache」では、HttpContext.Current ではなく HttpRuntime を使うとパフォーマンスがわずかに向上することが示されています。したがって、ProductsCL では HttpRuntime を使っています。

Note

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

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

Const CacheDuration As Double = 60.0
Private Sub AddCacheItem(ByVal rawKey As String, ByVal value As Object)
    DataCache.Insert(GetCacheKey(rawKey), value, Nothing, _
        DateTime.Now.AddSeconds(CacheDuration), _
        System.Web.Caching.Cache.NoSlidingExpiration)
End Sub

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 でデータ変更メソッドを実装する方法を示しています。

<DataObjectMethodAttribute(DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(productName As String, _
    unitPrice As Nullable(Of Decimal), productID As Integer) _
    As Boolean
    Dim result As Boolean = API.UpdateProduct(productName, unitPrice, productID)
    ' TODO: Invalidate the cache
    Return result
End Function

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

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

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

Private Sub AddCacheItem(ByVal rawKey As String, ByVal value As Object)
    Dim DataCache As System.Web.Caching.Cache = HttpRuntime.Cache
    ' Make sure MasterCacheKeyArray[0] is in the cache - if not, add it
    If DataCache(MasterCacheKeyArray(0)) Is Nothing Then
        DataCache(MasterCacheKeyArray(0)) = DateTime.Now
    End If
    ' Add a CacheDependency
    Dim dependency As New Caching.CacheDependency(Nothing, MasterCacheKeyArray) _
        DataCache.Insert(GetCacheKey(rawKey), value, dependency, _
        DateTime.Now.AddSeconds(CacheDuration), _
        System.Web.Caching.Cache.NoSlidingExpiration)
End Sub

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

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

<DataObjectMethodAttribute(DataObjectMethodType.Update, False)> _
Public Function UpdateProduct(ByVal productName As String, _
    ByVal unitPrice As Nullable(Of Decimal), ByVal productID As Integer) _
    As Boolean
    Dim result As Boolean = API.UpdateProduct(productName, unitPrice, productID)
    ' Invalidate the cache
    InvalidateCache()
    Return result
End Function
Public Sub InvalidateCache()
    ' Remove the cache dependency
    HttpRuntime.Cache.Remove(MasterCacheKeyArray(0))
End Sub

ステップ 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 Murphy でした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。