Share via


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

作成者: 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 を作成します。 アプリケーション全体の完全なキャッシュ層を構築するには、および クラスをCategoriesCLEmployeesCL作成しSuppliersCL、BLL のデータ アクセスまたは変更メソッドごとにこれらのキャッシュ層クラスにメソッドを提供する必要があります。 BLL と DAL と同様に、キャッシュ層は、別のクラス ライブラリ プロジェクトとして実装することが理想的です。ただし、 フォルダー内 App_Code のクラスとして実装します。

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

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

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

クラスには 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
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 メソッドを呼び出す必要があります。 次のシーケンス図に示すように、戻り値をキャッシュしてから返す必要があります。

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

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

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

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

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

注意

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

まず、クラスと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 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) は指定された キー 値を使用しませんが、代わりに メソッドを 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

注意

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

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

注意

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

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

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

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

キャッシュを無効にする場合は、 クラスによって追加された可能性のある すべての 項目を削除する 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単一の依存関係 を指定します。 CacheDependency次に、 が メソッドにInsert渡されます。

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

ProductsCL クラスは、ビジネス オブジェクト Drop-Down リストに含まれています

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

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

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 は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

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