HOW 2 LEARN ASP.NET
نویسنده : delshad
تاریخ  : ۱۳۸۹/۴/۱۰
امتیاز :
بازدید : 837
موضوع : برنامه نویسی چند لایه قسمت چهارم : لایه کش (CL یا Cache Layer)
توضیحات : در این مقاله لایه کش (Cache) به لایه های پروژه افزوده خواهد شد
     

برنامه نویسی چند لایه قسمت چهارم : لایه کش (CL یا Cache Layer)

در مقالات قبلی با ضرورت لایه بندی پروژه ، لایه ارتباط با بانک اطلاعاتی و لایه منطق تجاری و لایه واسط کاربر آشنا شدیم ، در این مقاله قصد دارم یک لایه جدید به پروژه اضافه کنم ، این لایه به افزایش سرعت لود اطلاعات و همچنین بهبود در کارایی سیستم و کاهش فشار بر روی بانک اطلاعاتی کمک زیادی خواهد کرد .

این لایه Cache Layer یا لایه کش نام دارد ، همانطور که میدانید Cache بر خلاف دیتابیس اطلاعات (که اطلاعات را در هارد دیسک ذخیره می کند) را در حافظه جانبی (RAM) ذخیره می کند بنابراین سرعت دسترسی و خواندن و نوشتن اطلاعات بسیار بالا خواهد بود ، بنابراین مکان مناسبی برای ذخیره اطلاعاتی است که به کرات درخواست می شود و به ندرت به روز می گردد .

این لایه حد فاصل لایه BLL و UI قرار میگیرد و باعث می گردد به جای اینکه اطلاعات به صورت مستقیم از دیتابیس درخواست داده شود از کش خوانده شود .

برای شروع کار ابتدا یک پروژه جدید از نوع Class Library به نام CL به Solution اضافه کنید (طبق روال قبل) ، قبل از هر چیز پروژه BLL را در این پروژه Add Refrence نمایید ، سپس یک کلاس به نام CLBase به این پروژه اضافه کنید ، این کلاس شامل Property ها و متدهایی است که در تمام کلاس ها استفاده می شود (مانند کلاس مادر در لایه DAL) .

همانطور که میدانید کلاس Cache در فضا نام System.Web قرار دارد بنابراین باید این فضا نام را به پروژه اضافه کنیم ، برای اینکار وارد منوی Project>Add Refrence شده از تب اول (NET.) فضا نام System.Web را انتخاب کرده و تایید نمایید .

در کلاس CLBase این فضا نام را Using کنید :

 

using System.Web;

 

سپس دو Property زیر را اضافه نمایید :

 


        protected string MasterCacheKey { get; set; }
        protected double CacheDuration { get; set; }

 

سپس منتد های زیر را نیز به کلاس بیافزایید ، در نهایت کلاس مادر به شکل زیر خواهد بود :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace CL
{
    public class CLBase
    {

        protected string MasterCacheKey { get; set; }
        protected double CacheDuration { get; set; }


        protected string GetCacheKey(string cacheKey)
        {
            return string.Concat(MasterCacheKey, "-", cacheKey);
        }
        protected object GetCacheItem(string rawKey)
        {
            return HttpRuntime.Cache[GetCacheKey(rawKey)];
        }
        protected 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[MasterCacheKey] == null)
                DataCache[MasterCacheKey] = DateTime.Now;

            // Add a CacheDependency
            System.Web.Caching.CacheDependency dependency = new System.Web.Caching.CacheDependency(null, new string[] { MasterCacheKey });
            DataCache.Insert(GetCacheKey(rawKey), value, dependency, DateTime.Now.AddMinutes(CacheDuration), System.Web.Caching.Cache.NoSlidingExpiration);
        }
        public void InvalidateCache()
        {
            // Remove the cache dependency
            HttpRuntime.Cache.Remove(MasterCacheKey);
        }

    }
}

متد اول بسیار سادست ، تنها کاری که میکند این است که نام کلید اصلی کلاس کش را به نام کش مربوط الصاق می کند ، این کار برای جلوگیری از تکرار در نام کش ها است .

متد دوم با دریافت نام Cache آن را از حافظه واکشی می کند و متد سوم وظیفه درج یک آیتم جدید در کش را بر عهده دارد و متد چهارم کش را ریست می نماید .

اکنون که کلاس مادر حاضر شده است به سراغ یکی از کلاس Users رفته و آن را پیاده سازی می کنیم ، برای این کار یک کلاس جدید به نام UsersCL یا Users به این پروژه اضافه کنید ، و آنرا از کلاس مادر یعنی CLBase مشتق نمایید . در سازنده کلاس (Constructor) دو خاصیت MasterCacheKey و CacheDuration را مقدار دهی می کنیم و سپس متد GetUsersByUserID را در لایه کش پیاده سازی می نماییم :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CL
{
    public class Users : CLBase
    {
        public Users()
        {
            CacheDuration = 60.0;
            MasterCacheKey = "UsersCache";

        }
        public List<BLL.Users> GetUserByUserID(int userId)
        {
            string rawKey = string.Concat("UserByUserID-", userId);
            List<BLL.Users> UserData = GetCacheItem(rawKey) as List<BLL.Users>;

            if (UserData == null)
            {
                UserData = BLL.Users.GetUserByUserID(userId);
                AddCacheItem(rawKey, UserData);
            }

            return UserData;
        }
    }
}

همانطور که ملاحظه می کنید ابتدا یک نام برای کش درنظر گرفته شده است ، این نام ترکیبی از کلمه UserByUserID و کد کاربری است بنابراین به ازای هر کاربر یک کش در حافظه ذخیره می شود (البته معمولا در این گونه موارد از کش استفاده نمی شود و این جا فقط جنبه آموزشی دارد)

سپس توسط متد GetCacheItem که در کلاس مادر نوشتیم مقدار کش واکشی شده و در یک شی از نوع لیست کلاس BLL.Users ریخته می شود ، واضح است که بار اول که این متد فراخوانی می شود مقدار بازگشتی Null خواهد بود چرا که کشی در کار نیست !

سپس در صورت Null بودن این مقدار اطلاعات از طریق لایه BLL از دیتابیس واکشی شده و توسط متد AddCacheItem در کش ذخیره می شود ، بدیهی است دفعه آتی شرط برقرار نخواهد شد و اطلاعات به جای اینکه از دیتابیس واکشی شود از کش درخواست می گردد .

کار تقریبا تمام است ، برای تست میتوانید در لایه UI ابتدا پروژه CL را AddRefrence کرده و سپس به صورت زیر عمل نمایید :

     CL.Users UserFromCache = new CL.Users();
        GridView2.DataSource = UserFromCache.GetUserByUserID(-1);
        GridView2.DataBind();

بنده دو Girdview در صفحه قرار دادم ، یکی از لایه BLL و دیگری از CL بایند می شوند ، بار اول اطلاعات هر دو جدول یکسان بود :

پس از تغییر اطلاعات در بانک اطلاعاتی ملاحظه می کنید که اطلاعاتی که از کش واکشی می شوند به روز نشده اند  :

 

برای ریست کردن کش هم خیلی ساده میتوانید از متد زیر استفاده کنید :

 

     CL.Users UserFromCache = new CL.Users();
     UserFromCache.InvalidateCache();

 

نکته لازم به ذکر این است که این استفاده از این لایه کاملا اختیاری است ، این لایه نیاز به دقت بیشتری نسبت به لایه های دیگر داشته و هرگونه اشتباه در استفاده از آن باعث بروز مشکلات فراوانی در پروژه شما خواهد شد و بالعکس استفاده با دقت و هوشمندانه سایت شما را در سطح بسیار بالایی بهینه خواهد کرد .

 

فایل ضمیمه پروژه را از اینجا دانلود فرمایید


 

 

 
امتیاز بدهید :

نویسنده : سعید واعظ saeed.tiro@gmail.com ۱۳۸۹ يازدهم شهريور
سلام ، اول از همه معذرت میخوام چون فرموده بودید سوالات فنی رو تو این قسمت نپرسید ولی چون مشکلم مهم بود وباید زودتر حل میشد (چون واسه پروژه ای باید معماری 3 لایه رو کاملا رعایت می کردم )اینجا نوشتم تا آقای HOW2LEARN سریعتر کمکم کنند . بعد از اینکه جوابمو دادید سوالم رو می تونید از این صفحه سایتتون پاک کنید . پس لطفا در اولین فرصت جوابمو بدید من فایل ضمیمه رو دانلود کردم اما واسه اجراش 2 تا مشکل دارم : 1)اولیش اینه که وقتی فایل Mdf رو می خوام Attach کنم این Error رو میده: An error occurred when attaching the database(s). Click the hyperlink in the Message column for details. البته این مشکل اولم رو خودم 1 جورهایی حل کردم یعنی با توضیحاتی که داده بودید رفتم تو خود محیط SQL فیلدهای ذیل رو تو table ای بنام خودم TBLUsersایجاد کردم : UserID,FirstName,LastName,EmailAddress,UserName,Password,UserStatus 2)مشکل دوم اینه: وقتی تو خود محیط VS2008 می خوام اجرا کنم این Error رو میده: Error 1 It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. C:\Documents and Settings \ 4tier\UI\web.config 48 آقایHOW2LEARN لطفا راهنماییم کنید تا برنامه ای که از سایتتون دانلود کردم رو بتونم کاملا اجرا کنم ؛ چون اگه بتونم اجراش کنم وکار کنه میتونم به کدهاش نگاه کنم و یاد بگیرم و تو پروژ ه ام از این نوع معماری 3 لایه استفاده کنم. فکر نکنم مشکل مربوط به IIS بشه . اگه راهنماییم کنید تا اجرا بشه ازتون واقعا ممنون میشم. البته یکسری error هم موقع اجرا میده که صفحه اصلی و توضیحاتش رو پایین آوردم: Wednesday, September 08, 2010 07:57 AM BLL Wednesday, September 08, 2010 07:57 AM CL Wednesday, September 08, 2010 07:57 AM DAL Wednesday, September 08, 2010 07:57 AM UI Monday, June 30, 2008 01:40 AM 3,282 3-tier.sln Monday, June 30, 2008 01:44 AM 31,744 3-tier.suo Thursday, September 02, 2010 01:18 AM 7,846 Web.config Description: The type of page you have requested is not served because it has been explicitly forbidden. The extension '.config' may be incorrect. Please review the URL below and make sure that it is spelled correctly. Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly. Line 46: ASP.NET to identify an incoming user. Line 47: --> Line 48: Line 49: section enables configuration آقای how2learn لطفا تا جایی که میتونید کمک کنید چون اگه مشکلم جدی نبود تا این حد توضیح نمی دادم . اگه هم خواستید لطف کنید تو ضیحاتتون رو واسم ایمیل بزنید. ویا اگه نسخه ای که درست اجرا میشه رو واسم ایمیل بزنید چون اگه اجرا بشه خودم یاد میگیرم. ممنون
نویسنده : vahid1357 Fromu2vahid@gmail.com ۱۳۸۹ دهم شهريور
با تشکر فراوان بسیار آموزنده بود.
نویسنده : نادر مینایی nader.mineh@gmail.com ۱۳۸۹ دوازدهم تير
عالي بود علي آقا . ممنون
نویسنده : ali a.aazxc@yahoo.com ۱۳۸۹ دوازدهم تير
به عنوان اولین نفر تمام آموزشهای لایه بندی و شی گراییتونو خوندم خیلی خوب توضیح میدین و فن بیان قوی دارین به خصوص تو شی گرایی که یه کتاب 500 صفحه رو تو 6 تا مقاله جمع و جور توضیح دادین ممنون

 
نظر بدهید :
لطفا سوالات فنی خود را در تالار گفتگو www.forum.how2learnasp.net مطرح نمایید
نام :  
ایمیل :    
نظرات :
 
Xml rss feed

 

Valid CSS! Atom rss feed
Ali Delshad Official Site