Mimaride Verileri Önbelleğe Alma (VB)

tarafından Scott Mitchell

PDF’yi İndir

Ö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.

Önbelleğe Alma Katmanı (CL), Mimarimizdeki Başka Bir Katmandı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 , EmployeesCLve SuppliersCL sınıflarının oluşturulması CategoriesCLve 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ü CLolarak adlandırın. Bu klasörü oluşturduktan sonra klasörüne adlı ProductsCL.vbyeni bir sınıf ekleyin.

CL Adlı Yeni Bir Klasör ve ProductsCL.vb Adlı Bir Sınıf Ekleme

Ş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, EmployeesCLve 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ınCacheInsert 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.

Önbelleğe Alma Katmanının Yöntemleri, Kullanılabilirse Önbellekten Veri Döndürür

Ş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.ProductsDataTabledepolanan 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 Returnerişiliyor olmasıdır. Bu koda ulaşıldığında değil, Cache("key")Nothingancak 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). MasterCacheKeyArrayProductsCache 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") = valuesöz dizimine izin verir. Mimari içindeki bir sınıftan veri önbelleğine veya HttpContext.Current.Cachekullanılarak HttpRuntime.Cache erişilebilir. Peter Johnson'ın blog girdisi HttpRuntime.Cache ile HttpContext.Current.Cache karşılaştırması yerine HttpContext.Currentkullanı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, Updateveya 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.

ProductsCL Sınıfı İş Nesnesi Drop-Down Listesine Dahil Edilir

Ş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 ProductsCLsonra İ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.

ProductsCL Sınıfı Yöntemleri Drop-Down Listeler

Ş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, , CategoryNameve UnitPrice alanları için ProductNamealanları 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 ProductsCLiç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.