次の方法で共有


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

スコット・ミッチェル著

PDF をダウンロードする

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

イントロダクション

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

このチュートリアルでは、キャッシュ ポリシーを使用 するキャッシュ層 (または略して CL) を含むようにアーキテクチャを拡張します。 キャッシュ層には、ProductsCLGetProducts()などのメソッドを使用して製品情報へのアクセスを提供するGetProductsByCategoryID(categoryID) クラスが含まれます。このクラスは、呼び出されると、最初にキャッシュからデータを取得しようとします。 キャッシュが空の場合、これらのメソッドは 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 で 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 メソッドを呼び出す必要があります。 次のシーケンス図に示すように、戻り値をキャッシュしてから返す必要があります。

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

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

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

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

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

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

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

Cache.Remove(key)

手順 3: ProductsCLClass から製品情報を返す

このチュートリアルでは、 ProductsCL クラスから製品情報を返す 2 つのメソッド ( GetProducts()GetProductsByCategoryID(categoryID)) を実装します。 ビジネス ロジック レイヤーの 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)メソッドは、この後で確認しますが、指定したキーに基づいてキャッシュから特定の項目を返します。 キャッシュにそのようなデータが見つからない場合は、対応する ProductsBLL クラス メソッドから取得され、 AddCacheItem(key, value) メソッドを使用してキャッシュに追加されます。

GetCacheItem(key)メソッドとAddCacheItem(key, value)メソッドは、それぞれデータ キャッシュとインターフェイスし、値の読み取りと書き込みを行います。 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 で始まる キー を返します。 文字列 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 は、HttpRuntimeではなくHttpContext.Currentを使用する場合のパフォーマンス上のわずかな利点を示しています。そのため、ProductsCLHttpRuntimeを使用します。

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

項目がキャッシュに見つからない場合、 ProductsCL クラスのメソッドは 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 s 対応するデータ変更メソッドを呼び出してキャッシュを無効にします。 前のチュートリアルで説明したように、これは、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

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

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

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

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

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

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

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

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

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

ウィザードが完了すると、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 から取得されることに注意してください。

この記事に付属するダウンロードで提供されているキャッシュレイヤーは完全ではありません。 これには 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 は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・セルフ ASP.NET 24時間で2.0です。 彼には mitchell@4GuysFromRolla.comで連絡できます。

特別な感謝

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