アーキテクチャでデータをキャッシュする (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
、対応する Business Logic Layer クラス (ProductsBLL
) にあるのと同じデータ アクセスおよび変更メソッドのセットを含める必要があります。 これらのすべてのメソッドを作成するのではなく、CL で使用されるパターンの感覚を得るために、ここでいくつかのメソッドを作成しましょう。 具体的には、手順 3 の メソッドと GetProductsByCategoryID(categoryID)
メソッドと、手順 4 のオーバーロードをUpdateProduct
追加GetProducts()
します。 残りの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 はキャッシュに格納されるデータの種類です。たとえば、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
でデータ キャッシュに直接アクセスすることです。 このコードに到達したときに、 が ではなくNothing
、 Cache("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.Cache
をHttpRuntime.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
変更を保存し、 フォルダー内のページをCaching
FromTheArchitecture.aspx
開き、GridView を追加します。 GridView のスマート タグから、新しい ObjectDataSource を作成します。 ウィザードの最初の手順では、ドロップダウン リストのオプションの 1 つとして クラスが表示 ProductsCL
されます。
図 4: クラスが ProductsCL
ビジネス オブジェクトの Drop-Down リストに含まれています (フルサイズの画像を表示する をクリックします)
を選択したら ProductsCL
、[次へ] をクリックします。 [選択] タブのドロップダウン リストには 2 つの項目 GetProducts()
があり GetProductsByCategoryID(categoryID)
、[更新] タブには唯一 UpdateProduct
のオーバーロードがあります。 GetProducts()
[選択] タブからメソッドを選択しUpdateProducts
、[更新] タブからメソッドを選択し、[完了] をクリックします。
図 5: クラスのメソッドが ProductsCL
Drop-Down Lists に一覧表示されている (フルサイズの画像を表示する をクリックします)
ウィザードが完了すると、Visual Studio によって ObjectDataSource の OldValuesParameterFormatString
プロパティが に original_{0}
設定され、適切なフィールドが GridView に追加されます。 プロパティを OldValuesParameterFormatString
既定値に戻し、ページング、 {0}
並べ替え、編集をサポートするように GridView を構成します。 UploadProducts
CL によって使用されるオーバーロードは、編集された製品の名前と価格のみを受け入れるため、これらのフィールドのみが編集可能になるように GridView を制限します。
前のチュートリアルでは、および UnitPrice
フィールドのフィールドを含むように GridView をProductName
CategoryName
定義しました。 この書式設定と構造を自由にレプリケートできます。この場合、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行をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示