アーキテクチャでデータをキャッシュする (VB)
前のチュートリアルでは、プレゼンテーション層でキャッシュを適用する方法を学習しました。 このチュートリアルでは、階層化アーキテクチャを利用してビジネス ロジック層でデータをキャッシュする方法について説明します。 これを行うには、アーキテクチャを拡張してキャッシュ層を含めます。
はじめに
前のチュートリアルで説明したように、ObjectDataSource のデータのキャッシュは、いくつかのプロパティを設定するのと同じくらい簡単です。 残念ながら、ObjectDataSource はプレゼンテーション層でキャッシュを適用します。これにより、キャッシュ ポリシーと ASP.NET ページが密接に結合されます。 階層化アーキテクチャを作成する理由の 1 つは、このような結合を切ることができるようにすることです。 たとえば、ビジネス ロジック層は ASP.NET ページからビジネス ロジックを切り離し、データ アクセス層はデータ アクセスの詳細を切り離します。 このビジネス ロジックとデータ アクセスの詳細の切り離しによってシステムの読み取り、保守性、変更の柔軟性が高まるため、推奨されます。 また、それによりドメイン知識および労働の役割分担が考慮され、プレゼンテーション層で作業する開発者が自分の仕事をするためにデータベースの詳細を知る必要がありません。 プレゼンテーション層からキャッシュ ポリシーを切り離す場合も、同様の利点があります。
このチュートリアルでは、キャッシュ ポリシーを使用する "キャッシュ層" (または略して CL) を含むようにアーキテクチャを拡張します。 キャッシュ層には、呼び出されたときに最初にキャッシュからデータを取得しようとする GetProducts()
、GetProductsByCategoryID(categoryID)
などのメソッドを使用して製品情報へのアクセスを提供する ProductsCL
クラスが含まれます。 キャッシュが空の場合、これらのメソッドは 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
クラスには、対応するビジネス ロジック層のクラス (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
に格納されるデータの種類です。たとえば、key はキャッシュ項目を一意に識別するキーです。 指定した key を持つ項目がキャッシュ内にない場合、instance は Nothing
で、データは適切な 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
クラス ライブラリ プロジェクトを使用してアーキテクチャが実装されている場合は、HttpRuntime
と HttpContext
クラスを使うために 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 がそのキャッシュ機能を有効にして、その 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
ビジネス ロジック層の適切なデータ変更メソッドが呼び出されますが、応答が返される前にキャッシュを無効にする必要があります。 残念ながら、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
を指定します。 その後、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
クラスに保存し、Caching
フォルダーの FromTheArchitecture.aspx
ページを開き、GridView を追加します。 次に、GridView のスマート タグから新しい ObjectDataSource を作成します。 ウィザードの最初のステップでは、ドロップダウン リストのオプションの 1 つとして ProductsCL
クラスが表示されます。
図 4: ProductsCL
クラスがビジネス オブジェクトのドロップダウン リストに含まれている (クリックするとフルサイズの画像が表示されます)
ProductsCL
を選択した後、[次へ] をクリックします。 [SELECT] タブのドロップダウン リストには、GetProducts()
と GetProductsByCategoryID(categoryID)
の 2 つの項目があり、[UPDATE] タブには唯一の UpdateProduct
オーバーロードがあります。 [SELECT] タブから GetProducts()
メソッドを選択し、[UPDATE] タブから UpdateProducts
メソッドを選択して、[完了] をクリックします。
図 5: ProductsCL
クラスのメソッドがドロップダウン リストに一覧表示されている (クリックするとフルサイズの画像が表示されます)
ウィザードが完了すると、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 から取得されます。
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行をドロップしてください。