Mimaride Verileri Önbelleğe Alma (C#)

Scott Mitchell tarafından

Örnek uygulamayı indirin veya PDF 'yi indirin

Önceki öğreticide, sunum katmanında önbelleğe almayı nasıl uygulayacağınızı öğrendiniz. Bu öğreticide, Iş mantığı katmanındaki verileri önbelleğe almak için katmanlı mimarimizden nasıl yararlanalabileceğinizi öğreniyoruz. Bunu, bir önbelleğe alma katmanı içerecek şekilde genişleterek yapacağız.

Giriş

Önceki öğreticide gördüğümüz gibi, ObjectDataSource verilerinin önbelleğe alınması, birkaç özelliği ayarlamak kadar basittir. Ne yazık ki, ObjectDataSource sunum katmanında önbelleğe alma uygular ve bu da önbelleğe alma ilkelerini ASP.NET sayfası ile sıkı bir şekilde bağar. Katmanlı mimari oluşturma nedenlerinden biri, bu tür bağların bozulmasına izin vermeleridir. Örneğin Iş mantığı katmanı, ASP.NET sayfalarından iş mantığını ayırır, ancak veri erişim katmanı veri erişim ayrıntılarını ayırır. İş mantığı ve veri erişimi ayrıntılarının bu şekilde ayrılması, sistemin daha okunabilir, daha fazla sürdürülebilir ve daha esnek bir şekilde değiştirilmesine olanak sağladığından, bölümünde tercih edilir. Ayrıca, etki alanı bilgisi ve işçiden çalışan bir geliştiricinin sunum katmanında çalışan bir geliştiricinin işini yapmak için veritabanı s ayrıntılarını öğrenme gereksinimi yoktur. Ön belleğe alma ilkesi sunum katmanından ayrılmaktadır, benzer avantajlar sunar.

Bu öğreticide, kendi önbelleğe alma ilkenizi kullanan bir önbelleğe alma katmanı (veya kısa için CL) dahil olmak üzere mimarimizi kullanacağız. Önbelleğe alma katmanı, GetProducts(), GetProductsByCategoryID(categoryID), vb. gibi yöntemlerle ürün bilgilerine erişim sağlayan bir ProductsCL sınıfı içerir. Bu, çağrıldığında ilk olarak verileri önbellekten almaya çalışır. Önbellek boşsa, bu yöntemler BLL 'de uygun ProductsBLL yöntemini çağırır ve bu da verileri DAL 'ten alır. ProductsCL yöntemleri, BLL 'den alınan verileri döndürmeden önce önbelleğe alabilir.

Şekil 1 ' de gösterildiği gibi, CL sunum ve Iş mantığı katmanları arasında bulunur.

Önbelleğe alma katmanı (CL) mimarimizde başka bir katmandır

Şekil 1: önbelleğe alma KATMANı (CL) mimarimize ait başka bir katmandır

1. Adım: önbelleğe alma katmanı sınıfları oluşturma

Bu öğreticide, tek bir sınıf olan ProductsCL basit bir CL oluşturacak ve yalnızca birkaç yöntem içeren bir. Tüm uygulama için tam bir önbelleğe alma katmanının oluşturulması, CategoriesCL, EmployeesCLve SuppliersCL sınıfları oluşturmayı ve BLL içindeki her veri erişimi veya değiştirme yöntemi için bu önbelleğe alma katmanı sınıflarında bir yöntem sağlamayı gerektirir. BLL ve DAL gibi, önbelleğe alma katmanı ideal olarak ayrı bir sınıf kitaplığı projesi olarak uygulanmalıdır; Ancak, bunu App_Code klasöründe bir sınıf olarak uygulayacağız.

, DAL ve BLL sınıflarından CL sınıflarını daha temiz bir şekilde ayırmak için, s App_Code klasöründe yeni bir alt klasör oluşturalım. Çözüm Gezgini App_Code klasöre sağ tıklayın, yeni klasör ' i seçin ve yeni klasörü CLadlandırın. Bu klasörü oluşturduktan sonra, ProductsCL.csadlı yeni bir sınıf ekleyin.

CL adlı yeni bir klasör ve ProductsCL.cs adlı bir sınıf ekleyin

Şekil 2: CL adlı yeni bir klasör ve ProductsCL.cs adlı bir sınıf ekleyin

ProductsCL sınıfı, karşılık gelen Iş mantığı katman sınıfında bulunan (ProductsBLL) aynı veri erişimi ve değiştirme yöntemleri kümesini içermelidir. Bu yöntemlerin tümünü oluşturmak yerine, yalnızca CL 'nin kullandığı desenleri almak için burada birkaç şey oluşturalım. Özellikle adım 3 ' teki GetProducts() ve GetProductsByCategoryID(categoryID) yöntemleri ve adım 4 ' te bir UpdateProduct aşırı yüklemesi ekleyeceğiz. Kalan ProductsCL yöntemleri ve CategoriesCL, EmployeesCLve SuppliersCL sınıflarını boş bir şekilde ekleyebilirsiniz.

2. Adım: veri önbelleğini okuma ve yazma

Önceki öğreticide araştırılan ObjectDataSource 'un ö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 Ayrıca, ASP.NET Pages arka plan kod sınıflarından veya Web uygulaması mimarisindeki sınıflardan programlı olarak erişilebilir. ASP.NET Page s arka plan kod sınıfından veri önbelleğini okumak ve yazmak için aşağıdaki kalıbı 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);

Cache sınıf s Insert yöntemi çok sayıda aşırı yükleme içeriyor. Cache["key"] = value ve Cache.Insert(key, value) eş anlamlı olduğundan, tanımlı süre sonu olmadan belirtilen anahtarı kullanarak önbelleğe bir öğe ekler. Genellikle, bir öğeyi bir bağımlılık, zaman tabanlı süre sonu veya her ikisi olarak önbelleğe eklerken bir süre sonu belirtmek istiyoruz. Bağımlılık veya zaman tabanlı süre sonu bilgilerini sağlamak için diğer Insert yöntemi aşırı yüklerinden birini kullanın.

Önbelleğe alma katmanının yöntemlerinin, öncelikle istenen verilerin önbellekte olup olmadığını denetlemesi gerekir ve varsa, buradan döndürün. İ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ınıp döndürülmelidir.

Önbelleğe alma katmanı öğeleri, varsa verileri önbellekten döndürür

Şekil 3: önbelleğe alma katmanı öğeleri, varsa verileri önbellekten döndürür

Şekil 3 ' te gösterilen sıra, CL sınıflarında aşağıdaki model 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 depolanan verilerin türüdür Northwind.ProductsDataTable, örneğin, anahtar , önbellek öğesini benzersiz bir şekilde tanımlayan anahtardır. Belirtilen anahtara sahip öğe önbellekte değilse, örnek null olur ve veriler uygun BLL yönteminden alınır ve önbelleğe eklenir. return instance zamana ulaşıldığında, örnek önbellekten ya da BLL 'den çekilerek verilerin bir başvurusunu içerir.

Önbellekteki verilere erişirken yukarıdaki kalıbı kullandığınızdan emin olun. İlk bakışta eşdeğer olarak görünen aşağıdaki model, yarış koşulunu tanıtan bir hafif fark içerir. Yarış durumlarının hata ayıklaması zordur, çünkü kendilerini kendi sporlarını açığa çıkarır ve yeniden oluşturmak zordur.

if (Cache["key"] == null)
{
    Cache.Insert(key, BllMethodToGetInstance(), ...);
}
return Cache["key"];

Bu saniyelik fark, yanlış kod parçacığı, yerel bir değişkende önbelleğe alınmış öğeye başvuru depolamak yerine, veri önbelleğine doğrudan koşullu ifadede ve returnerişildiğine göre yapılır. Bu koda ulaşıldığında, Cache["key"]``nullolmayan, return bildirimine ulaşılmadan önce, sistem önbellekten çıkarılan anahtarı düşünün. Bu nadir durumda, kod beklenen türde bir nesne yerine bir null değer döndürür.

Note

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, atomik olması gereken önbellekteki veriler üzerinde 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 uygulamaktan siz sorumlusunuz. Daha fazla bilgi için bkz. ASP.net önbelleğine erişimi eşitleme .

Bir öğe, bu gibi Remove yöntemi kullanılarak veri önbelleğinden program aracılığıyla çıkartılanalabilir:

Cache.Remove(key);

3. Adım:ProductsCLsınıfından ürün bilgilerini döndürme

Bu öğreticide, s ProductsCL sınıfından ürün bilgilerini döndürmek için iki yöntem uygulayalim: GetProducts() ve GetProductsByCategoryID(categoryID). Iş mantığı katmanındaki ProductsBL sınıfı gibi, CL 'deki GetProducts() yöntemi bir Northwind.ProductsDataTable nesnesi olarak tüm ürünlerin bilgilerini döndürür, ancak GetProductsByCategoryID(categoryID) belirtilen bir kategorideki tüm ürünleri döndürür.

Aşağıdaki kod ProductsCL sınıfındaki yöntemlerin bir parçası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 ve yöntemlere uygulanan DataObject ve DataObjectMethodAttribute özniteliklerini aklınızda edin. Bu öznitelikler, sihirbaz s adımlarında hangi sınıfların ve yöntemlerin görüneceğini belirten ObjectDataSource 'un sihirbazına ilişkin bilgiler sağlar. CL sınıfları ve yöntemlerine sunu katmanındaki bir ObjectDataSource 'tan erişildiğinden, tasarım zamanı deneyimini geliştirmek için bu öznitelikleri ekledik. Bu öznitelikler ve etkileri hakkında daha kapsamlı bir açıklama için Iş mantığı katmanı oluşturma öğreticisine geri bakın.

GetProducts() ve GetProductsByCategoryID(categoryID) yöntemlerinde, GetCacheItem(key) yönteminden döndürülen veriler yerel bir değişkene atanır. Kısa süre içinde inceleyeceğiz GetCacheItem(key) yöntemi, belirtilen anahtaragöre önbellekten belirli bir öğeyi döndürür. Önbellekte böyle bir veri bulunamazsa, karşılık gelen ProductsBLL Class yönteminden alınır ve AddCacheItem(key, value) yöntemi kullanılarak önbelleğe eklenir.

GetCacheItem(key) ve AddCacheItem(key, value) yöntemleri, veri önbelleği, sırasıyla değerleri okuma ve yazma ile arabirimidir. GetCacheItem(key) yöntemi iki basittir. 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), anahtar değeri sağlanan şekilde kullanmaz, ancak bunun yerine productscache-ile anahtar önüne geri dönüş döndüren GetCacheKey(key) yöntemini çağırır. ProductsCache dizesini tutan MasterCacheKeyArray, aynı anda kısaca göreceğiniz gibi AddCacheItem(key, value) yöntemi tarafından da kullanılır.

ASP.NET sayfa arka plan kod sınıfından veri önbelleğine Page Class s Cache özelliğikullanılarak erişilebilir ve adım 2 ' de anlatıldığı gibi Cache["key"] = valuegibi sözdizimine izin verir. Mimari içindeki bir sınıftan veri önbelleğine HttpRuntime.Cache veya HttpContext.Current.Cachekullanılarak erişilebilir. Peter Johnson'un blog girişi HttpRuntime. Cache ile. HttpContext. Current. Cache , HttpContext.Currentyerine HttpRuntime kullanmanın hafif performans avantajlarından yararlanır. Sonuç olarak, ProductsCL HttpRuntimekullanır.

Note

Mimariniz sınıf kitaplığı projeleri kullanılarak uygulanırsa, httpRuntime ve HttpContext sınıflarını kullanabilmeniz için System.Web derlemesine bir başvuru eklemeniz gerekir.

Öğe önbellekte bulunamazsa, ProductsCL sınıfı yöntemleri BLL 'den verileri alır ve AddCacheItem(key, value) metodunu kullanarak önbelleğe ekler. Önbelleğe değer eklemek için, 60 saniyelik zaman aşımı süresi 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), gelecekte zaman tabanlı süre sonu 60 saniye belirtir System.Web.Caching.Cache.NoSlidingExpiration , bir on Kayan süre sonu olmadığını gösterir. Bu Insert yöntemi aşırı yüklemesi hem mutlak hem de kayan süre sonu için giriş parametrelerine sahip olsa da, bunlardan yalnızca birini sağlayabilirsiniz. Hem mutlak bir zaman hem de bir zaman aralığı belirtmeye çalışırsanız Insert yöntemi bir ArgumentException özel durumu oluşturur.

Note

AddCacheItem(key, value) yönteminin bu uygulamasında şu anda bazı eksikler bulunur. 4. adımda bu sorunları ele alacağız ve aşacağız.

4. Adım: veriler mimari aracılığıyla değiştirildiğinde önbelleğin geçersiz kılınması

Veri alma yöntemlerinin yanı sıra, önbelleğe alma katmanının verileri eklemek, güncelleştirmek ve silmek için BLL ile aynı yöntemleri sağlaması gerekir. CL verileri değiştirme yöntemleri önbelleğe alınmış verileri değiştirmez, bunun yerine BLL s ile ilgili veri değiştirme yöntemini çağırır ve sonra önbelleği geçersiz kılar. Önceki öğreticide gördüğünüz gibi bu, ObjectDataSource 'un, önbelleğe alma özellikleri etkinleştirildiğinde ve Insert, Updateveya Delete yöntemleri çağrıldığında uyguladığı davranıştır.

Aşağıdaki UpdateProduct aşırı yüklemesi, veri değiştirme yöntemlerinin CL 'de nasıl uygulanacağı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 Iş mantığı katmanı yöntemi çağrılır, ancak yanıtı döndürülmeden önce önbelleğin geçersiz kılması gerekir. Ne yazık ki, ProductsCL sınıf s GetProducts() ve GetProductsByCategoryID(categoryID) yöntemlerinin her biri farklı anahtarlarla önbelleğe öğe eklediğinden ve GetProductsByCategoryID(categoryID) yöntemi her benzersiz CategoryIDiçin farklı bir önbellek öğesi eklediğinden, önbelleğin geçersiz kılınması basittir.

Önbelleği geçersiz kıldığınızda, ProductsCL sınıfı tarafından eklenmiş olabilecek Tüm öğeleri kaldırdık. Bu, AddCacheItem(key, value) yönteminde önbelleğe eklenen her öğe ile bir önbellek bağımlılığı ilişkilendirerek gerçekleştirilebilir. Genel olarak, bir önbellek bağımlılığı önbellekteki başka bir öğe, dosya sistemindeki bir dosya veya Microsoft SQL Server veritabanından alınan veriler olabilir. Bağımlılık değiştiğinde veya önbellekten kaldırıldığında, ilişkili olduğu önbellek öğeleri otomatik olarak önbellekten çıkarılır. Bu öğreticide, ProductsCL sınıfı aracılığıyla eklenen tüm öğeler için önbellek bağımlılığı görevi gören önbellekte ek bir öğe oluşturmak istiyoruz. Bu şekilde, yalnızca önbellek bağımlılığını kaldırarak bu öğelerin tümü önbellekten kaldırılabilir.

Bu yöntem aracılığıyla önbelleğe eklenen her öğenin tek bir önbellek bağımlılığı ile ilişkilendirilmesi için AddCacheItem(key, value) metodunu güncelleştirmesine izin verin:

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 tek bir değer tutan bir dize dizisidir. İlk olarak, önbelleğe bir önbellek öğesi eklenir ve geçerli tarih ve saate atanır. Önbellek öğesi zaten varsa, güncelleştirilir. Ardından, bir önbellek bağımlılığı oluşturulur. CacheDependency sınıfı oluşturucusunun çok sayıda aşırı yüklemesi vardır, ancak burada kullanılmakta olan bir iki string dizi girişi bekler. İlki, bağımlılıklar olarak kullanılacak dosya kümesini belirtir. Dosya tabanlı herhangi bir bağımlılığı kullanmak istemediğimiz için, ilk giriş parametresi için null değeri kullanılır. İkinci giriş parametresi, bağımlılıklar olarak kullanılacak önbellek anahtarları kümesini belirtir. Burada tek bağlılığımız MasterCacheKeyArraybelirttik. CacheDependency sonra Insert yöntemine geçirilir.

AddCacheItem(key, value)için bu değişiklik ile önbelleğin kaldırılması, bağımlılığı kaldırmak kadar basittir.

[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: önbelleğe alma katmanını sunum katmanından çağırma

Önbelleğe alma katmanı sınıfları ve yöntemleri, bu öğreticiler genelinde inceduğumuz teknikleri kullanarak verilerle çalışmak için kullanılabilir. Önbelleğe alınmış verilerle çalışmayı göstermek için, ProductsCL sınıfına yaptığınız değişiklikleri kaydedin ve sonra Caching klasörde FromTheArchitecture.aspx sayfasını açın ve bir GridView ekleyin. GridView s akıllı etiketinden yeni bir ObjectDataSource oluşturun. Sihirbazın ilk adımında, ProductsCL sınıfını açılır listedeki seçeneklerden biri olarak görmeniz gerekir.

ProductsCL sınıfı , Iş nesnesi açılır listesine dahil edilmiştir

Şekil 4: ProductsCL sınıfı, Iş nesnesi açılır listesine dahildir (tam boyutlu görüntüyü görüntülemek için tıklayın)

ProductsCLseçtikten sonra Ileri ' ye tıklayın. SEÇIM sekmesindeki açılan listede iki öğe vardır-GetProducts() ve GetProductsByCategoryID(categoryID) ve GÜNCELLEŞTIRME sekmesi tek UpdateProduct aşırı yüküne sahiptir. Seç sekmesinden GetProducts() yöntemini ve GÜNCELLEŞTIRME sekmesinden UpdateProducts yöntemini seçin ve son ' a tıklayın.

ProductsCL sınıfı yöntemleri açılır listelerde listelenmiştir

Şekil 5: ProductsCL sınıfı yöntemleri aşağı açılan listelerde listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Sihirbazı tamamladıktan sonra, Visual Studio, ObjectDataSource OldValuesParameterFormatString özelliğini original_{0} olarak ayarlar ve GridView 'a uygun alanları ekler. OldValuesParameterFormatString özelliğini varsayılan değerine geri değiştirin, {0}ve GridView 'u sayfalama, sıralamayı ve düzenlemesini destekleyecek şekilde yapılandırın. CL tarafından kullanılan UploadProducts aşırı yüklemesi yalnızca düzenlenen ürün adı ve fiyatını kabul ettiğinden, GridView 'u yalnızca bu alanların düzenlenebilir olması için sınırlayın.

Önceki öğreticide, ProductName, CategoryNameve UnitPrice alanları için alanları eklemek üzere bir GridView tanımladık. Bu biçimlendirmeyi ve yapıyı çoğaltıp, bu durumda GridView ve ObjectDataSource 'un bildirim temelli biçimlendirmesinin aşağıdakine benzer şekilde görünmesi gerekir:

<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 sayfa sunuyoruz. Önbelleği eylemde görmek için ProductsCL sınıf s GetProducts() ve UpdateProduct yöntemlerinde kesme noktaları ayarlayın. Bir tarayıcıdaki sayfayı ziyaret edin ve önbellekten çekilen verileri görmek için sıralama ve sayfalama sırasında kodu adım adım ilerleyin. Sonra bir kaydı güncelleştirin ve önbelleğin geçersiz kılındığına ve sonuç olarak veri GridView 'a yeniden bağlandığında BLL 'den alındığını unutmayın.

Note

Bu makaleye eşlik eden indirme işleminde belirtilen önbelleğe alma katmanı tamamlanmamış. Yalnızca tek bir sınıf içerir, tek bir yöntem ProductsCL. Üstelik, yalnızca tek bir ASP.NET sayfası CL 'yi (~/Caching/FromTheArchitecture.aspx) kullanır. diğer tüm diğerleri de BLL 'ye doğrudan başvurmuş. Uygulamanızda bir CL kullanmayı planlıyorsanız, sunum katmanından tüm çağrılar CL 'ye gitmelidir, bu da bu sınıfların ve yöntemlerin, sunu katmanı tarafından şu anda kullanılan BLL 'de kapsanmakta olması gerekir.

Özet

Önbelleğe alma, ASP.NET 2,0 s SqlDataSource ve ObjectDataSource denetimleriyle sunum katmanında uygulanacaksa, ideal önbelleğe alma sorumluluklarına mimaride ayrı bir katman atanabilir. Bu öğreticide, sunum katmanı ve Iş mantığı katmanı arasında yer alan bir önbelleğe alma katmanı oluşturduk. Önbelleğe alma katmanının BLL 'de var olan sınıf ve yöntemlerin aynı kümesini sağlaması gerekir ve sunum katmanından çağrılır.

Bu ve önceki öğreticilerde araştırdığımız önbelleğe alma katmanı örnekleri, reaktif yükleme. Reaktif yükleme ile veriler yalnızca veri isteği yapıldığında ve önbellekte veriler olmadığında önbelleğe yüklenir. Veriler, gerçekten gerekli olmadan önce önbelleğe verileri belleğe yükleyen bir tekniktir ve önbelleğe yüklenebilir. Bir sonraki öğreticide, uygulama başlangıcında statik değerlerin önbelleğe nasıl depolanacağını göz atadığımızda bir proaktif yükleme örneği görüyoruz.

Programlamanın kutlu olsun!

Yazar hakkında

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğretici için müşteri adayı gözden geçireni bir Murph idi. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .