Mimaride Verileri Önbelleğe Alma (C#)

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.csyeni bir sınıf ekleyin.

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

Şekil 2: Adlı Yeni Klasör ve Adlandırılmış CL Sınıf Ekleme ProductsCL.cs

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
object value = 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:

Type instance = Cache["key"] as Type;
if (instance == null)
{
    instance = BllMethodToGetInstance();
    Cache.Insert(key, instance, ...);
}
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 null 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"] == null)
{
    Cache.Insert(key, BllMethodToGetInstance(), ...);
}
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, Cache["key"] bu koda ulaşılmadığınınull, ancak deyimine return ulaşılmadan önce sistemin önbellekten anahtar çıkardığını düşünün. Bu nadir durumda, kod beklenen türde bir null nesne yerine bir değer döndürür.

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 ProductsBLL _productsAPI = null;
    protected ProductsBLL API
    {
        get
        {
            if (_productsAPI == null)
                _productsAPI = new ProductsBLL();
            return _productsAPI;
        }
    }
    
   [System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public Northwind.ProductsDataTable GetProducts()
    {
        const string rawKey = "Products";
        // See if the item is in the cache
        Northwind.ProductsDataTable products = _
            GetCacheItem(rawKey) as Northwind.ProductsDataTable;
        if (products == null)
        {
            // Item not found in cache - retrieve it and insert it into the cache
            products = API.GetProducts();
            AddCacheItem(rawKey, products);
        }
        return products;
    }
    
    [System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductsByCategoryID(int categoryID)
    {
        if (categoryID < 0)
            return GetProducts();
        else
        {
            string rawKey = string.Concat("ProductsByCategory-", categoryID);
            // See if the item is in the cache
            Northwind.ProductsDataTable products = _
                GetCacheItem(rawKey) as Northwind.ProductsDataTable;
            if (products == null)
            {
                // Item not found in cache - retrieve it and insert it into the cache
                products = API.GetProductsByCategoryID(categoryID);
                AddCacheItem(rawKey, products);
            }
            return products;
        }
    }
}

İ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 object GetCacheItem(string rawKey)
{
    return HttpRuntime.Cache[GetCacheKey(rawKey)];
}
private readonly string[] MasterCacheKeyArray = {"ProductsCache"};
private string GetCacheKey(string cacheKey)
{
    return string.Concat(MasterCacheKeyArray[0], "-", cacheKey);
}

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, HttpRuntime ve HttpContext sınıflarını kullanmak için derlemeye bir başvuru System.Web 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 double CacheDuration = 60.0;
private void AddCacheItem(string rawKey, object value)
{
    HttpRuntime.Cache.Insert(GetCacheKey(rawKey), value, null, 
        DateTime.Now.AddSeconds(CacheDuration), Caching.Cache.NoSlidingExpiration);
}

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:

[System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, int productID)
{
    bool result = API.UpdateProduct(productName, unitPrice, productID);
    // TODO: Invalidate the cache
    return result;
}

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 s GetProducts() ve yöntemlerinin ProductsCL her biri önbelleğe farklı anahtarlarla öğe eklediğinden ve GetProductsByCategoryID(categoryID)GetProductsByCategoryID(categoryID) yöntemi her benzersiz categoryID için farklı bir önbellek öğesi eklediğinden önbelleğin geçersiz kılınması kolay değildir.

Önbelleği geçersiz kıldığında, sınıfı tarafından ProductsCL eklenmiş olabilecek tüm öğeleri kaldırmamız gerekir. Bu, önbellek bağımlılığını yöntemindeki önbelleğeAddCacheItem(key, value) eklenen her öğeyle ilişkilendirerek 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 öğretici için, önbellekte sınıfına 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şkili olması için yöntemini güncelleştirelim AddCacheItem(key, value) :

private void AddCacheItem(string rawKey, object value)
{
    System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
    // Make sure MasterCacheKeyArray[0] is in the cache - if not, add it
    if (DataCache[MasterCacheKeyArray[0]] == null)
        DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
    // Add a CacheDependency
    System.Web.Caching.CacheDependency dependency = 
        new CacheDependency(null, MasterCacheKeyArray);
    DataCache.Insert(GetCacheKey(rawKey), value, dependency, 
        DateTime.Now.AddSeconds(CacheDuration), 
        System.Web.Caching.Cache.NoSlidingExpiration);
}

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. Herhangi bir dosya tabanlı bağımlılık kullanmak istemediğimiz için, ilk giriş parametresi için değeri null 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 kolaydır.

[System.ComponentModel.DataObjectMethodAttribute(DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, int productID)
{
    bool result = API.UpdateProduct(productName, unitPrice, productID);
    // Invalidate the cache
    InvalidateCache();
    return result;
}
public void InvalidateCache()
{
    // Remove the cache dependency
    HttpRuntime.Cache.Remove(MasterCacheKeyArray[0]);
}

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ıfına ProductsCL yaptığınız değişiklikleri 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 sınıfı, ProductsCL açılan listedeki seçeneklerden biri olarak görmeniz gerekir.

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

Şekil 4: ProductsCL Sınıf İş Nesnesi Drop-Down Listesine Dahildir (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) UPDATE sekmesinde 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ının Yöntemleri Drop-Down Listeler

Şekil 5: Sınıf ProductsCL 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 GridView'a uygun alanları ekler. Özelliğini varsayılan değerine {0}geri döndürerek OldValuesParameterFormatString GridView'u 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üzenlenmiş ürünün adını ve fiyatını kabul ettiğinden GridView'u yalnızca bu alanların düzenlenebilir olması için sınırlayın.

Önceki öğreticide, , CategoryNameve UnitPrice alanlarını ProductNameiçerecek şekilde 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 var. Önbelleğin nasıl çalıştığını görmek için, sınıf 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 ilerleyin. Ardından bir kaydı güncelleştirin ve önbelleğin geçersiz kılındığını ve sonuç olarak veriler GridView'a yeniden bağlandığında 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 spor yapan 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 tüm kullanıcılar BLL'ye doğrudan başvurur. Uygulamanızda CL kullanmayı planlıyorsanız, Sunu Katmanı'ndan yapılan tüm çağrıların CL'ye gitmesi gerekir. Bu, CL sınıflarının ve yöntemlerinin sunu katmanı tarafından kullanılmakta olan 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 uygulanabilirken, 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 öğreticide incelediğimiz Önbelleğe Alma Katmanı örnekleri ve önceki öğreticilerde reaktif yükleme sergilendi. Reaktif yüklemeyle, veriler önbelleğe yalnızca bir veri isteği yapıldığında ve bu veriler önbellekte olmadığında 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 önbellekte statik değerlerin nasıl depolandığında proaktif yükleme örneği 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 Hours 2.0'dır. 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 Murph idi. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.