Mimaride Verileri Önbelleğe Alma (VB)
tarafından Scott Mitchell
Önceki öğreticide, Sunu Katmanı'nda önbelleğe alma uygulamayı öğrendik. Bu öğreticide, verileri İş Mantığı Katmanı'nda önbelleğe almak için katmanlı mimarimizden nasıl yararlanacağımızı öğreneceğiz. Bunu, mimariyi Önbelleğe Alma Katmanı içerecek şekilde genişleterek yaparız.
Giriş
Önceki öğreticide gördüğümüz gibi, ObjectDataSource verilerini önbelleğe almak, birkaç özellik ayarlamak kadar basittir. Ne yazık ki, ObjectDataSource, önbelleğe alma ilkelerini ASP.NET sayfasıyla sıkı bir şekilde birleyen Sunu Katmanı'nda önbelleğe alma uygular. Katmanlı mimari oluşturmanın nedenlerinden biri, bu tür bağlantıların bozulmasına izin vermektir. Örneğin İş Mantığı Katmanı, iş mantığını ASP.NET sayfalarından ayrıştırırken, Veri Erişim Katmanı veri erişim ayrıntılarını birbirinden kaldırır. Bu iş mantığı ve veri erişim ayrıntılarını ayırma tercih edilir, çünkü kısmen sistemi daha okunabilir, daha sürdürülebilir ve değiştirilmesi daha esnek hale getirir. Ayrıca, Sunu Katmanı üzerinde çalışan bir geliştiricinin işini yapmak için veritabanının ayrıntılarını tanıması gerekmeyen etki alanı bilgisi ve iş bölümü sağlar. Önbelleğe alma ilkesini Sunu Katmanı'ndan ayırma işlemi de benzer avantajlar sunar.
Bu öğreticide, mimarimizi önbelleğe alma ilkemizi kullanan bir Önbelleğe Alma Katmanı (veya kısaca CL) içerecek şekilde genişleteceğiz. Önbelleğe Alma Katmanı, , GetProductsByCategoryID(categoryID)
vb. gibi GetProducts()
yöntemlerle ürün bilgilerine erişim sağlayan ve çağrıldığında ilk olarak önbellekten verileri almayı deneyen bir ProductsCL
sınıf içerir. Önbellek boşsa, bu yöntemler BLL'de uygun ProductsBLL
yöntemi çağırır ve bu da DAL'den verileri alır. ProductsCL
Yöntemler, BLL'den alınan verileri döndürmeden önce önbelleğe alır.
Şekil 1'de gösterildiği gibi CL, Sunu ve İş Mantığı Katmanları arasında yer alır.
Şekil 1: Önbelleğe Alma Katmanı (CL), Mimarimizdeki Başka Bir Katmandır
1. Adım: Önbelleğe Alma Katmanı Sınıflarını Oluşturma
Bu öğreticide, yalnızca birkaç yöntemi olan tek bir sınıfla ProductsCL
çok basit bir CL oluşturacağız. Uygulamanın tamamı için eksiksiz bir Önbelleğe Alma Katmanı oluşturmak için , EmployeesCL
ve SuppliersCL
sınıflarının oluşturulması CategoriesCL
ve BLL'deki her veri erişimi veya değişiklik yöntemi için bu Önbelleğe Alma Katmanı sınıflarında bir yöntem sağlanması gerekir. BLL ve DAL'de olduğu gibi Önbelleğe Alma Katmanı da ideal olarak ayrı bir Sınıf Kitaplığı projesi olarak uygulanmalıdır; ancak bunu klasöründe sınıf App_Code
olarak uygulayacağız.
CL sınıflarını DAL ve BLL sınıflarından daha temiz bir şekilde ayırmak için klasöründe yeni bir alt klasör App_Code
oluşturalım. Çözüm Gezgini klasöre App_Code
sağ tıklayın, Yeni Klasör'e tıklayın ve yeni klasörü CL
olarak adlandırın. Bu klasörü oluşturduktan sonra klasörüne adlı ProductsCL.vb
yeni bir sınıf ekleyin.
Şekil 2: Adlı Yeni Klasör ve Adlandırılmış CL
Sınıf Ekleme ProductsCL.vb
sınıfı, ProductsCL
ilgili İş Mantığı Katmanı sınıfında (ProductsBLL
) bulunan veri erişimi ve değişiklik yöntemleri kümesini içermelidir. Bu yöntemlerin tümünü oluşturmak yerine, CL tarafından kullanılan desenlere yönelik bir his elde etmek için burada bir çift oluşturalım. Özellikle, 3. Adımda ve GetProductsByCategoryID(categoryID)
yöntemlerini ve 4. Adımda bir UpdateProduct
aşırı yüklemeyi ekleyeceğizGetProducts()
. Boş zamanlarınızda kalan ProductsCL
yöntemleri ve CategoriesCL
, EmployeesCL
ve SuppliersCL
sınıflarını ekleyebilirsiniz.
2. Adım: Veri Önbelleğini Okuma ve Yazma
Önceki öğreticide incelenen ObjectDataSource önbelleğe alma özelliği, BLL'den alınan verileri depolamak için ASP.NET veri önbelleğini dahili olarak kullanır. Veri önbelleğine ASP.NET sayfaların arka planındaki sınıflardan veya web uygulamasının mimarisindeki sınıflardan program aracılığıyla da erişilebilir. Bir ASP.NET sayfasının arka planda kod sınıfından veri önbelleğini okumak ve yazmak için aşağıdaki deseni kullanın:
' 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)
sınıfınınCache
Insert
yönteminin bir dizi aşırı yüklemesi vardır. Cache("key") = value
ve Cache.Insert(key, value)
eş anlamlıdır ve her ikisi de tanımlı süre sonu olmadan belirtilen anahtarı kullanarak önbelleğe bir öğe ekler. Genellikle, önbelleğe bir öğe eklerken bağımlılık, zamana bağlı süre sonu veya her ikisi için bir süre sonu belirtmek isteriz. Bağımlılık veya zamana bağlı süre sonu bilgileri sağlamak için diğer Insert
yöntem aşırı yüklemelerinden birini kullanın.
Önbelleğe Alma Katmanı yöntemlerinin önce istenen verilerin önbellekte olup olmadığını denetlemesi ve varsa oradan döndürmesi gerekir. İstenen veriler önbellekte değilse, uygun BLL yönteminin çağrılması gerekir. Aşağıdaki sıralı diyagramda gösterildiği gibi dönüş değeri önbelleğe alınmalı ve döndürülmelidir.
Şekil 3: Önbelleğe Alma Katmanı Yöntemleri Kullanılabilirse Önbellekten Veri Döndürür
Şekil 3'te gösterilen sıra, CL sınıflarında aşağıdaki desen kullanılarak gerçekleştirilir:
Dim instance As Type = TryCast(Cache("key"), Type)
If instance Is Nothing Then
instance = BllMethodToGetInstance()
Cache.Insert(key, instance, ...)
End If
Return instance
Burada Tür , önbellekte Northwind.ProductsDataTable
depolanan verilerin türüdür; örneğin , anahtar önbellek öğesini benzersiz olarak tanımlayan anahtardır. Belirtilen anahtara sahip öğe önbellekte değilse , örnek olur Nothing
ve veriler uygun BLL yönteminden alınır ve önbelleğe eklenir. Ulaşılana kadar Return instance
örnek , önbellekten alınan veya BLL'den çekilen verilere bir başvuru içerir.
Önbellekten verilere erişirken yukarıdaki düzeni kullandığınızdan emin olun. İlk bakışta eşdeğer görünen aşağıdaki desen, bir yarış durumu tanıtır ince bir fark içerir. Yarış koşullarının hata ayıklaması zordur çünkü kendilerini düzensiz bir şekilde ortaya koyuyorlar ve yeniden üretiliyorlar.
If Cache("key") Is Nothing Then
Cache.Insert(key, BllMethodToGetInstance(), ...)
End If
Return Cache("key")
Bu ikinci, yanlış kod parçacığındaki fark, önbelleğe alınan öğeye bir başvuruyu yerel değişkende depolamak yerine, veri önbelleğine doğrudan koşullu deyimde ve içinde Return
erişiliyor olmasıdır. Bu koda ulaşıldığında değil, Cache("key")
Nothing
ancak deyimine Return
ulaşılmadan önce sistemin önbellekten anahtar çıkardığını düşünün. Bu nadir durumda, kod beklenen türde bir nesne yerine döndürür Nothing
.
Not
Veri önbelleği iş parçacığı açısından güvenlidir, bu nedenle basit okuma veya yazma işlemleri için iş parçacığı erişimini eşitlemeniz gerekmez. Ancak önbellekteki veriler üzerinde atomik olması gereken birden çok işlem gerçekleştirmeniz gerekiyorsa, iş parçacığı güvenliğini sağlamak için bir kilit veya başka bir mekanizma uygulamak sizin sorumluluğundadır. Daha fazla bilgi için bkz. ASP.NET Önbelleğine Erişimi Eşitleme .
Bir öğe, aşağıdaki gibi bir yöntem kullanılarakRemove
veri önbelleğinden program aracılığıyla çıkarılabilir:
Cache.Remove(key)
3. Adım: SınıftanProductsCL
Ürün Bilgilerini Döndürme
Bu öğretici için sınıfından ProductsCL
ürün bilgilerini döndürmek için iki yöntem uygulayalım: GetProducts()
ve GetProductsByCategoryID(categoryID)
. İş Mantığı Katmanı'ndaki sınıfı gibi ProductsBL
CL'deki GetProducts()
yöntemi de tüm ürünlerle ilgili bilgileri nesne Northwind.ProductsDataTable
olarak döndürürken GetProductsByCategoryID(categoryID)
, belirtilen kategorideki tüm ürünleri döndürür.
Aşağıdaki kod, sınıfındaki yöntemlerin ProductsCL
bir bölümünü gösterir:
<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
İlk olarak, sınıfına DataObject
ve yöntemlerine uygulanan ve DataObjectMethodAttribute
özniteliklerini not edin. Bu öznitelikler ObjectDataSource sihirbazına, sihirbazın adımlarında hangi sınıfların ve yöntemlerin görünmesi gerektiğini belirten bilgiler sağlar. CL sınıflarına ve yöntemlerine Sunu Katmanındaki bir ObjectDataSource'tan erişileceğinden, tasarım zamanı deneyimini geliştirmek için bu öznitelikleri ekledim. Bu öznitelikler ve bunların etkileri hakkında daha ayrıntılı bir açıklama için İş Mantığı Katmanı Oluşturma öğreticisine geri bakın.
ve GetProductsByCategoryID(categoryID)
yöntemlerindeGetProducts()
, yönteminden GetCacheItem(key)
döndürülen veriler yerel bir değişkene atanır. GetCacheItem(key)
Kısa süre içinde inceleyeceğiz yöntemi, belirtilen anahtara göre önbellekten belirli bir öğeyi döndürür. Önbellekte böyle bir veri bulunmazsa, ilgili ProductsBLL
sınıf yönteminden alınır ve ardından yöntemi kullanılarak AddCacheItem(key, value)
önbelleğe eklenir.
GetCacheItem(key)
ve AddCacheItem(key, value)
yöntemleri, sırasıyla veri önbelleği, okuma ve yazma değerleriyle arabirim oluşturur. GetCacheItem(key)
yöntemi, ikisinin daha basitidir. Yalnızca geçirilen anahtarı kullanarak Cache sınıfından değeri döndürür:
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)
sağlanan anahtar değerini kullanmaz, bunun yerine ProductsCache- ile önceden eklenen anahtarı döndüren yöntemini çağırırGetCacheKey(key)
. MasterCacheKeyArray
ProductsCache dizesini tutan , yöntemi tarafından AddCacheItem(key, value)
da kullanılır çünkü birazdan göreceğiz.
bir ASP.NET sayfasının arka planda kod sınıfından, veri önbelleğine sınıf s Cache
özelliği kullanılarak Page
erişilebilir ve 2. Adımda açıklandığı gibi gibi Cache("key") = value
söz dizimine izin verir. Mimari içindeki bir sınıftan veri önbelleğine veya HttpContext.Current.Cache
kullanılarak HttpRuntime.Cache
erişilebilir. Peter Johnson'ın blog girdisi HttpRuntime.Cache ile HttpContext.Current.Cache karşılaştırması yerine HttpContext.Current
kullanımın HttpRuntime
küçük performans avantajını belirtir; sonuç olarak ProductsCL
kullanırHttpRuntime
.
Not
Mimariniz Sınıf Kitaplığı projeleri kullanılarak uygulandıysa ve HttpContext
sınıflarını kullanmak HttpRuntime
için System.Web
derlemeye bir başvuru eklemeniz gerekir.
Öğe önbellekte bulunmazsa, ProductsCL
sınıf yöntemleri verileri BLL'den alır ve yöntemini kullanarak AddCacheItem(key, value)
önbelleğe ekler. Önbelleğe değer eklemek için 60 saniyelik süre sonu kullanan aşağıdaki kodu kullanabiliriz:
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)
zaman tabanlı süre sonunu 60 saniye olarak belirtirken System.Web.Caching.Cache.NoSlidingExpiration
, kayan süre sonu olmadığını belirtir. Bu Insert
yöntem aşırı yüklemesi hem mutlak hem de kayan süre sonu için giriş parametrelerine sahip olsa da, iki yöntemden yalnızca birini sağlayabilirsiniz. Hem mutlak bir zaman hem de bir zaman aralığı belirtmeye çalışırsanız, Insert
yöntemi bir ArgumentException
özel durum oluşturur.
Not
Yöntemin AddCacheItem(key, value)
bu uygulamasında şu anda bazı eksiklikler vardır. Bu sorunları 4. Adımda ele alacağız ve üstesinden geleceğiz.
4. Adım: Veriler Mimari Aracılığıyla Değiştirildiğinde Önbelleği Geçersiz Hale Getirme
Veri alma yöntemlerinin yanı sıra Önbelleğe Alma Katmanı'nın veri ekleme, güncelleştirme ve silme için BLL ile aynı yöntemleri sağlaması gerekir. CL'nin veri değiştirme yöntemleri önbelleğe alınan verileri değiştirmez, bunun yerine BLL'nin karşılık gelen veri değiştirme yöntemini çağırıp önbelleği geçersiz kılın. Önceki öğreticide gördüğümüz gibi, bu, ObjectDataSource'un önbelleğe alma özellikleri etkinleştirildiğinde ve Insert
, Update
veya Delete
yöntemleri çağrıldığında uyguladığı davranışla aynıdır.
Aşağıdaki UpdateProduct
aşırı yükleme, CL'de veri değiştirme yöntemlerinin nasıl uygulandığını gösterir:
<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
uygun veri değişikliği İş Mantığı Katmanı yöntemi çağrılır, ancak yanıtı döndürülmeden önce önbelleği geçersiz kılmamız gerekir. Ne yazık ki, sınıf ve GetProducts()
yöntemleri her biri farklı anahtarlara sahip öğeleri önbelleğe eklediğinden ve GetProductsByCategoryID(categoryID)
GetProductsByCategoryID(categoryID)
yöntemi her benzersiz categoryID için farklı bir önbellek öğesi eklediğinden ProductsCL
önbelleğin geçersiz kılınması basit bir işlem değildir.
Önbelleği geçersiz hale getirmek için sınıfı tarafından ProductsCL
eklenmiş olabilecek tüm öğeleri kaldırmamız gerekir. Bu, bir önbellek bağımlılığının yöntemindeki önbelleğeAddCacheItem(key, value)
eklenen her öğeyle ilişkilendirilmesiyle gerçekleştirilebilir. Genel olarak önbellek bağımlılığı önbellekteki başka bir öğe, dosya sistemindeki bir dosya veya Microsoft SQL Server veritabanındaki veriler olabilir. Bağımlılık değiştiğinde veya önbellekten kaldırıldığında, ilişkili olduğu önbellek öğeleri önbellekten otomatik olarak çıkarılır. Bu öğreticide, önbellekte sınıf aracılığıyla ProductsCL
eklenen tüm öğeler için önbellek bağımlılığı görevi görecek ek bir öğe oluşturmak istiyoruz. Bu şekilde, bu öğelerin tümü önbellek bağımlılığı kaldırılarak önbellekten kaldırılabilir.
Bu yöntem aracılığıyla önbelleğe eklenen her öğenin tek bir önbellek bağımlılığıyla ilişkilendirildiğinden yöntemini güncelleştirelim 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
, ProductsCache adlı tek bir değeri tutan bir dize dizisidir. İlk olarak, önbelleğe bir önbellek öğesi eklenir ve geçerli tarih ve saat atanır. Önbellek öğesi zaten varsa, güncelleştirilir. Ardından bir önbellek bağımlılığı oluşturulur. SınıfınCacheDependency
oluşturucusunun bir dizi aşırı yüklemesi vardır, ancak burada kullanılan iki dizi girişi beklerString
. İlki, bağımlılık olarak kullanılacak dosya kümesini belirtir. Dosya tabanlı bağımlılıkları kullanmak istemediğimiz için, ilk giriş parametresi için değeri Nothing
kullanılır. İkinci giriş parametresi, bağımlılık olarak kullanılacak önbellek anahtarları kümesini belirtir. Burada tek bağımlılığımızı belirteceğiz: MasterCacheKeyArray
. CacheDependency
daha sonra yöntemine Insert
geçirilir.
üzerinde yapılan bu değişiklikle AddCacheItem(key, value)
önbelleği geçersiz yapmak bağımlılığı kaldırmak kadar basit bir işlemdir.
<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. Adım: Sunu Katmanından Önbelleğe Alma Katmanını Çağırma
Önbelleğe Alma Katmanı sınıfları ve yöntemleri, bu öğreticiler boyunca incelediğimiz teknikler kullanılarak verilerle çalışmak için kullanılabilir. Önbelleğe alınmış verilerle çalışmayı göstermek için, sınıfta yaptığınız değişiklikleri ProductsCL
kaydedin ve ardından klasördeki Caching
sayfayı FromTheArchitecture.aspx
açın ve bir GridView ekleyin. GridView'un akıllı etiketinden yeni bir ObjectDataSource oluşturun. Sihirbazın ilk adımında ProductsCL
, sınıfı açılan listedeki seçeneklerden biri olarak görmeniz gerekir.
Şekil 4: Sınıf ProductsCL
İş Nesnesi Drop-Down Listesine Dahil Edilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
öğesini seçtikten ProductsCL
sonra İleri'ye tıklayın. SELECT sekmesindeki açılan listede iki öğe GetProducts()
vardır ve GetProductsByCategoryID(categoryID)
GÜNCELLEŞTIR sekmesinde ise tek UpdateProduct
aşırı yükleme vardır. SELECT sekmesinden GetProducts()
yöntemini ve GÜNCELLEŞTIR sekmesinden UpdateProducts
yöntemini seçin ve Son'a tıklayın.
Şekil 5: ProductsCL
Sınıf Yöntemleri Drop-Down Listeler Listelenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Sihirbazı tamamladıktan sonra Visual Studio ObjectDataSource özelliğini OldValuesParameterFormatString
olarak original_{0}
ayarlar ve uygun alanları GridView'a ekler. OldValuesParameterFormatString
özelliğini varsayılan değerine {0}
geri değiştirin ve GridView'ı sayfalama, sıralama ve düzenlemeyi destekleyecek şekilde yapılandırın. UploadProducts
CL tarafından kullanılan aşırı yükleme yalnızca düzenlenen ürünün adını ve fiyatını kabul ettiğinden GridView'ı yalnızca bu alanların düzenlenebilir olması için sınırlayın.
Önceki öğreticide, , CategoryName
ve UnitPrice
alanları için ProductName
alanları içerecek bir GridView tanımladık. Bu biçimlendirmeyi ve yapıyı çoğaltmaktan çekinmeyin; bu durumda GridView ve ObjectDataSource bildirim temelli işaretlemeniz aşağıdakine benzer görünmelidir:
<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>
Bu noktada Önbelleğe Alma Katmanını kullanan bir sayfamız vardır. Önbelleğin çalıştığını görmek için s sınıfında GetProducts()
ve UpdateProduct
yöntemlerinde ProductsCL
kesme noktaları ayarlayın. Tarayıcıda sayfayı ziyaret edin ve önbellekten çekilen verileri görmek için sıralama ve sayfalama sırasında kodda adım adım ilerleyin. Ardından bir kaydı güncelleştirin ve önbelleğin geçersiz kılındığını ve sonuç olarak veriler GridView'a geri geldiğinde BLL'den alındığını unutmayın.
Not
Bu makaleye eşlik eden indirmede sağlanan Önbelleğe Alma Katmanı tamamlanmadı. Yalnızca birkaç yöntemi destekleyen tek bir sınıf ProductsCL
içerir. Ayrıca, yalnızca tek bir ASP.NET sayfası CL'yi kullanır (~/Caching/FromTheArchitecture.aspx
) diğer tüm diğer kişiler BLL'ye doğrudan başvurmaya devam eder. Uygulamanızda CL kullanmayı planlıyorsanız, Sunu Katmanı'ndan yapılan tüm çağrılar CL'ye gitmelidir. Bu, CL sınıflarının ve yöntemlerinin şu anda Sunu Katmanı tarafından kullanılan BLL'de bu sınıfları ve yöntemleri kapsamasını gerektirir.
Özet
Önbelleğe alma, ASP.NET 2.0 s SqlDataSource ve ObjectDataSource denetimleriyle Sunu Katmanı'nda uygulanabilir, ancak ideal olarak önbelleğe alma sorumlulukları mimaride ayrı bir katmana devredilebilir. Bu öğreticide, Sunu Katmanı ile İş Mantığı Katmanı arasında yer alan bir Önbelleğe Alma Katmanı oluşturduk. Önbelleğe Alma Katmanı'nın BLL'de bulunan ve Sunu Katmanı'ndan çağrılan aynı sınıf ve yöntem kümesini sağlaması gerekir.
Bu adımda incelediğimiz Önbelleğe Alma Katmanı örnekleri ve önceki öğreticilerde reaktif yükleme sergilendi. Reaktif yükleme ile veriler önbelleğe yüklenir ancak veriler için bir istek yapıldığında ve bu veriler önbellekte eksik olduğunda yüklenir. Veriler önceden önbelleğe yüklenebilir . Bu teknik, verileri gerçekten ihtiyaç duyulmadan önce önbelleğe yükler. Sonraki öğreticide, uygulama başlangıcında statik değerlerin önbellekte nasıl depolandığında proaktif yükleme örneğini göreceğiz.
Mutlu Programlama!
Yazar hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.
Özel Teşekkürler
Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni Teresa Murphy'ydi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin