Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Önceki öğreticide, Sunu Katmanı'nda önbelleğe almanın nasıl uygulanacağını öğrendik. Bu öğreticide, İş Mantığı Katmanı'nda verileri ö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ı ayrıştırıyor. Bu iş mantığının ve veri erişim ayrıntılarının ayrıştırılma işlemi, kısmen sistemin daha okunabilir, daha sürdürülebilir ve daha esnek bir şekilde değiştirilmesini sağladığından tercih edilir. Ayrıca, alan bilgisi ve iş bölümü sağlar; Sunu Katmanı üzerinde çalışan bir geliştiricinin işini yapabilmesi için veritabanının ayrıntılarına aşina olması gerekmez. Önbellek ilkesini Sunu Katmanı'ndan ayırma işlemi 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ı, ProductsCL
ürün bilgilerine , ve benzeri GetProducts()
yöntemlerle erişim sağlayan, çağrıldığında verileri önbellekten almaya çalışacak bir GetProductsByCategoryID(categoryID)
sınıf içerir. Önbellek boşsa, bu yöntemler BLL'de uygun ProductsBLL
yöntemi çağırır ve bu da DAL'dan 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 , CategoriesCL
ve EmployeesCL
sınıflarının oluşturulması SuppliersCL
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örde yeni bir alt klasör App_Code
oluşturalım. Çözüm Gezgini'nde App_Code
klasöre sağ tıklayın, Yeni Klasör'e tıklayın ve yeni klasörü CL
adlandırın. Bu klasörü oluşturduktan sonra, klasörüne adlı ProductsCL.cs
yeni bir sınıf ekleyin.
Ş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 şablonlara yönelik bir hissiyat edinmek için burada birkaç yöntem oluşturalım. Özellikle, 3. Adımda GetProducts()
ve GetProductsByCategoryID(categoryID)
yöntemlerini ve 4. Adımda UpdateProduct
aşırı yüklemesini ekleyeceğiz. Kalan ProductsCL
yöntemleri ve CategoriesCL
, EmployeesCL
ve SuppliersCL
sınıflarını boş zamanlarınızda 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 planda kodlanmış sınıflarından 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);
Cache
s sınıfı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, bir öğeyi önbelleğe eklerken bağımlılık, zamana bağlı süre sonu veya her ikisi gibi 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:
Type instance = Cache["key"] as Type;
if (instance == null)
{
instance = BllMethodToGetInstance();
Cache.Insert(key, instance, ...);
}
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 null
ve veriler uygun BLL yönteminden alınır ve önbelleğe eklenir.
return instance
'a ulaşıldığında, örnek önbellekten ya da BLL'den çekilen veriye bir referans içerir.
Önbellekten verilere erişirken yukarıdaki deseni kullandığınızdan emin olun. İlk bakışta eşdeğer görünen aşağıdaki desen, bir yarış durumu getiren ince bir fark içerir. Yarış koşullarının hata ayıklaması zordur çünkü kendilerini düzensiz bir şekilde ortaya çıkarlar ve yeniden üretemezler.
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 return
erişilir. Bu koda ulaşıldığında Cache["key"]
null
değildir, ancak return
deyimine ulaşılmadan önce sistem önbellekten anahtarı çıkartır. Bu nadir durumda, kod beklenen türde bir null
nesne yerine bir değer döndürür.
Uyarı
Veri önbelleği iş parçacığı açısından güvenlidir, bu nedenle basit okumalar veya yazmalar 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 öğreticide, bu sınıfından ProductsCL
ürün bilgilerini döndürmek için iki yöntem geliştirelim: GetProducts()
ve GetProductsByCategoryID(categoryID)
. İş Mantığı Katmanı'ndaki sınıfıyla ProductsBL
olduğu gibi, GetProducts()
CL'deki yöntemi 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, ProductsCL
sınıfındaki yöntemlerin 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;
}
}
}
Öncelikle, sınıfa ve yöntemlere uygulanan DataObject
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 gösteren 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 etkileri hakkında daha ayrıntılı bir açıklama için İş 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. İnceleyeceğimiz GetCacheItem(key)
yöntemi, belirtilen anahtar temelinde önbellekten belirli bir öğe geri döndürür. Önbellekte böyle bir veri bulunmazsa, ilgili ProductsBLL
sınıf yönteminden alınır ve AddCacheItem(key, value)
yöntemi kullanılarak ö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 basittir. Geçirilen anahtarı kullanarak Önbellek sınıfından basitçe 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, ancak bunun yerine ProductsCache- ile önceden eklenen GetCacheKey(key)
döndüren yöntemini çağırır.
MasterCacheKeyArray
öğesini tutan ProductsCache dizisi, birazdan göreceğimiz gibi AddCacheItem(key, value)
yöntemi tarafından da kullanılır.
ASP.NET sayfasının arka plan kod sınıfından, veri önbelleğine HttpRuntime.Cache
veya HttpContext.Current.Cache
kullanarak erişilebilir.
Peter Johnson'ın blog girdisi HttpRuntime.Cache vs. HttpContext.Current.Cache, HttpRuntime
yerine HttpContext.Current
kullanmanın küçük bir performans avantajı sağladığını belirtir; sonuç olarak ProductsCL
, HttpRuntime
kullanır.
Uyarı
Mimariniz, Sınıf Kitaplığı projeleri kullanılarak uygulandıysa System.Web
derlemeye bir başvuru eklemeniz gerekir, böylece HttpRuntime ve HttpContext sınıflarını kullanabilirsiniz.
Öğe önbellekte bulunmazsa, ProductsCL
sınıf yöntemleri BLL'den verileri 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 gelecekte 60 saniye belirtirken System.Web.Caching.Cache.NoSlidingExpiration
kayan süre sonu olmadığını gösterir. Bu Insert
aşırı yükleme yönteminde hem mutlak hem de kayan süre sonu için giriş parametreleri olsa da, bunlardan yalnızca birini sağlayabilirsiniz. Hem mutlak bir saat hem de bir zaman aralığı belirtmeye çalışırsanız, Insert
yöntemi bir ArgumentException
özel durum oluşturur.
Uyarı
Yönteminin 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 ilgili veri değiştirme yöntemini çağırıp önbelleği geçersiz kılır. Ö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:
[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çin İş Mantığı Katmanı yöntemi çağrılır, ancak yanıtı dönmeden önce önbelleğin geçersiz kılınması gerekmektedir. Ne yazık ki, sınıf s ProductsCL
ve GetProducts()
yöntemleri her biri farklı anahtarlarla önbelleğe öğe eklediğinden GetProductsByCategoryID(categoryID)
ve 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 eklenmiş olabilecek ProductsCL
öğeleri kaldırmamız gerekir. Bu, bir önbellek bağımlılığı yöntemindeki önbelleğeAddCacheItem(key, value)
eklenen her öğeyle ilişkilendirilerek 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.
AddCacheItem(key, value)
yöntemini, bu yöntem aracılığıyla önbelleğe eklenen her öğenin tek bir önbellek bağımlılığı ile ilişkilendirilmesini sağlayacak şekilde güncelleyelim.
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.
CacheDependency
sınıf oluşturucusunun birden fazla aşırı yüklemesi vardır, ancak burada kullanılanı iki string
dizi girişi bekler. İ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 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 Insert
yöntemine 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ınan verilerle çalışmayı göstermek için, değişikliklerinizi sınıfa ProductsCL
kaydedin ve ardından klasördeki FromTheArchitecture.aspx
sayfayı Caching
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: ProductsCL
Sınıf İş Nesnesi Drop-Down Listesi'ne Dahildir (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 GetProducts()
ve GetProductsByCategoryID(categoryID)
olmak üzere iki öğe vardır ve UPDATE sekmesinde ise yalnızca 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 Listelerinde Listelenmiştir (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
original_{0}
olarak ayarlar ve uygun alanları GridView'a ekler.
OldValuesParameterFormatString
özelliğini varsayılan değeri {0}
olarak 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'u yalnızca bu alanların düzenlenebilir olması için sınırlayın.
Önceki öğreticide ProductName
, CategoryName
ve UnitPrice
alanlarını iç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 çalıştığını görmek için, ProductsCL
sınıfındaki ve GetProducts()
ile UpdateProduct
yöntemlerindeki kesme noktalarını 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 hale getirildiğine ve sonuç olarak verilerin GridView'a yeniden bağlandığında BLL'den alındığına dikkat edin.
Uyarı
Bu makaleye eşlik eden indirmede sağlanan Önbelleğe Alma Katmanı tamamlanmadı. Yalnızca birkaç yönteme sahip tek bir sınıf ProductsCL
içerir. Ayrıca, yalnızca tek bir ASP.NET sayfası CL kullanır (~/Caching/FromTheArchitecture.aspx
) diğer tüm diğerleri BLL'ye doğrudan başvurmaya devam eder. Uygulamanızda BIR 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 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 ve önceki eğitimlerde incelediğimiz Önbelleğe Alma Katmanı örnekleri reaktif yükleme sergiledi. Reaktif yüklemeyle, veriler önbelleğe yalnızca veriler için bir istek 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 statik değerleri önbelleğe nasıl yerleştireceğimize dair önceden 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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçireni Teresa Murph'tir. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.