前のチュートリアルでは、プレゼンテーションレイヤーでキャッシュを適用する方法を学習しました。 このチュートリアルでは、階層化されたアーキテクチャを利用してビジネス ロジック レイヤーでデータをキャッシュする方法について説明します。 これを行うには、アーキテクチャを拡張してキャッシュ 層を含めます。
イントロダクション
前のチュートリアルで説明したように、ObjectDataSource のデータのキャッシュは、いくつかのプロパティを設定するのと同じくらい簡単です。 残念ながら、ObjectDataSource はプレゼンテーション層でキャッシュを適用します。この場合、キャッシュ ポリシーと ASP.NET ページが密接に結合されます。 階層構造アーキテクチャを作成する理由の 1 つは、このような結合を破損できるようにすることです。 たとえば、ビジネス ロジック レイヤーはビジネス ロジックを ASP.NET ページから切り離し、データ アクセス層はデータ アクセスの詳細を切り離します。 このビジネス ロジックとデータ アクセスの詳細の切り離しは、システムの読みやすさ、保守性、変更の柔軟性が高くなるため、一部推奨されます。 また、プレゼンテーション層で作業する開発者が、自分の仕事をするためにデータベースの詳細を理解する必要がないドメイン知識と労働の分割を可能にします。 プレゼンテーション層からキャッシュ ポリシーを切り離す場合も、同様の利点があります。
このチュートリアルでは、キャッシュ ポリシーを使用 するキャッシュ層 (または略して CL) を含むようにアーキテクチャを拡張します。 キャッシュ層には、ProductsCL
、GetProducts()
などのメソッドを使用して製品情報へのアクセスを提供するGetProductsByCategoryID(categoryID)
クラスが含まれます。このクラスは、呼び出されると、最初にキャッシュからデータを取得しようとします。 キャッシュが空の場合、これらのメソッドは BLL で適切な ProductsBLL
メソッドを呼び出します。これにより、DAL からデータが取得されます。
ProductsCL
メソッドは、BLL から取得したデータを返す前にキャッシュします。
図 1 に示すように、CL はプレゼンテーション層とビジネス ロジック 層の間に存在します。
図 1: キャッシュ 層 (CL) は、アーキテクチャのもう 1 つのレイヤーです
手順 1: キャッシュ レイヤー クラスの作成
このチュートリアルでは、少数のメソッドしか持っていない 1 つのクラス ProductsCL
を持つ非常に単純な CL を作成します。 アプリケーション全体に対して完全なキャッシュレイヤーを構築するには、 CategoriesCL
、 EmployeesCL
、および SuppliersCL
クラスを作成し、BLL の各データ アクセスまたは変更メソッドに対してこれらのキャッシュ層クラスにメソッドを提供する必要があります。 BLL と DAL と同様に、キャッシュ 層は、別のクラス ライブラリ プロジェクトとして実装することが理想的です。ただし、 App_Code
フォルダー内のクラスとして実装します。
CL クラスと DAL クラスと BLL クラスをより正確に分離するには、 App_Code
フォルダーに新しいサブフォルダーを作成します。 ソリューション エクスプローラーで App_Code
フォルダーを右クリックし、[新しいフォルダー] を選択し、新しいフォルダーに CL
名前を付けます。 このフォルダーを作成した後、 ProductsCL.vb
という名前の新しいクラスを追加します。
図 2: CL
という名前の新しいフォルダーと名前付きクラスを追加する ProductsCL.vb
ProductsCL
クラスには、対応する Business Logic Layer クラス (ProductsBLL
) と同じデータ アクセスおよび変更メソッドのセットを含める必要があります。 これらのメソッドをすべて作成するのではなく、CL で使用されるパターンの感覚を得るために、ここでいくつかのメソッドを作成しましょう。 具体的には、手順 3 で GetProducts()
メソッドと GetProductsByCategoryID(categoryID)
メソッドを追加し、手順 4 で UpdateProduct
オーバーロードを追加します。 残りの ProductsCL
メソッドと CategoriesCL
、 EmployeesCL
、 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") = value
と Cache.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: ProductsCL
Class から製品情報を返す
このチュートリアルでは、 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
を使用する場合のパフォーマンス上のわずかな利点を示しています。そのため、ProductsCL
はHttpRuntime
を使用します。
注
クラス ライブラリ プロジェクトを使用してアーキテクチャを実装する場合は、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 のキャッシュ機能が有効になっていて、その 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 メソッドが呼び出されますが、応答が返される前にキャッシュを無効にする必要があります。 残念ながら、キャッシュの無効化は簡単ではありません。 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
を指定します。 その後、 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
クラスに変更を保存し、FromTheArchitecture.aspx
フォルダーのCaching
ページを開き、GridView を追加します。 GridView のスマート タグから、新しい ObjectDataSource を作成します。 ウィザードの最初の手順では、ドロップダウン リストのオプションの 1 つとして ProductsCL
クラスが表示されます。
図 4: ProductsCL
クラスがビジネス オブジェクト Drop-Down リストに含まれています (フルサイズの画像を表示する をクリックします)。
ProductsCL
を選択したら、[次へ] をクリックします。 SELECT タブのドロップダウン リストには、 GetProducts()
と GetProductsByCategoryID(categoryID)
の 2 つの項目があり、[UPDATE] タブには唯一の UpdateProduct
オーバーロードがあります。 [SELECT] タブから GetProducts()
メソッドを選択し、[UPDATE] タブから UpdateProducts
メソッドを選択し、[完了] をクリックします。
図 5: ProductsCL
クラスのメソッドが Drop-Down リストに一覧表示されます (フルサイズの画像を表示する をクリックします)。
ウィザードが完了すると、Visual Studio によって ObjectDataSource の OldValuesParameterFormatString
プロパティが original_{0}
に設定され、適切なフィールドが GridView に追加されます。
OldValuesParameterFormatString
プロパティを既定値に戻し、{0}
し、ページング、並べ替え、編集をサポートするように GridView を構成します。 CL によって使用される UploadProducts
オーバーロードは、編集された製品の名前と価格のみを受け入れるため、これらのフィールドのみが編集可能になるように GridView を制限します。
前のチュートリアルでは、 ProductName
、 CategoryName
、および 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にメッセージを送ってください。