خارطة الموقع برنامج مبيعات ونقاط البيع وجرد المستودعات ومحاسبة الرئيسية من نحن اتصل بنا English
يازسيس لهندسة البرمجيات
Skip Navigation Links
خوارزميات وانظمة التشفيرExpand خوارزميات وانظمة التشفير
خدمات البرمجة والتصميمExpand خدمات البرمجة والتصميم
تحميل البرامجExpand تحميل البرامج
تعليم & شروحاتExpand تعليم & شروحات
 
تعلم كيف تتعامل مع Application Objects
بواسطة احمد عادل موسى
2014-06-27
السلام عليكم
 
 
Application Object
Application Object
 
مقدمة : 
 
يعد Application Object أحد عشر حالات يمكن بهم حفظ حالة التطبيق أثناء إعادة التحميل للصفحة الواحدة او عند الإنتقال من صفحة لأخرى وحتى لا تحتار سأسرد لك العشرة حالات أو إن شئت قمت بتسميتهم طرق :-
 
- View State
- Hidden Fields
- Query String
- Control state
- Sessions
- Cookies
- Application
- Cache
- Profile
- Data base Support
 
يطلق على هؤلاء العشر أسم أو مصطلح عرف إنجليزياً بإسم "State Management" أو إدارة الحالة , بالطبع هناك فروق بينهم وإلا ما كانوا ليوجدوا من الأصل , ولكن قد يتشابه منهم البعض بالإخر , فمثال ما نتحدث عنه فى درس اليوم وهو Application Object يشبه فى عمله أحد ما قد أدرجناه بالأعلى وهو Cache إلا أن الثانى يمكن ان يتغير بتغير ما يسمى dependency (أى التبعية ) . وكلاهما يحفظ فى ذاكرة الخادم . وكلاهما يعمل بطريقة Dictionary , والمعنى انه يأخذ Key/Value .
 
الإن نتكلم عنه بشكل مركز دون غيره : 
من مميزاته انه كائن عام أى يمكن أن يراه ويستخدمه كل زوار الموقع فى صفحة واحد او أكثر وكذلك داخل HttpHandler أو Web Service .أينما كنت على مستوى التطبيق الواحد فلايمكن العمل معه على مستوى أكثر من تطبيق أو اكثر من خادم , وعليه فعند وجود بيانات ما نود أن يتعامل معها جميع الزوار , أياً كان نوع التعامل المطلوب ,سواء كان حساب عدد المشاهدات , حساب زوار الموقع من البداية إلى النهاية , أو حساب المتواجدين الإن , أو كما تحب ان تفعل ,يمكن ان تستخدم Application Object . 
 
من عيوبه انه يعود إلى قيمته الإبتدائية عند حدوث تعديلات فى ملف Web.Config , وكذلك عند عمل توقف أو إعادة تشغيل للتطبيق .لذا يمكنك تحجنب هذا الإمر كما فعل Imar (حاصل على MVP ومؤلف ) فى مقالته , عندما أراد عمل عداد زوار ,فقد قام بحفظ هذا الأمر فى ملف نصى .تجدها هنــــا :
http://imar.spaanjaa...ing-a-text-file 
 
 
إدارة حجم البيانات : 
 
عندما قلنا انه يمكن ان نستخدمه للأحتفاظ ببيانات عامة , فهذا يبين أن البيانات يمكن أن تصل إلى حد كبير عند تغيرها كلما زاد عدد المستخدمين , هذا إن كانت بيانات غير ثابتة ,فلعل ما يتبادر إلى الذهن أن هذة البيانات قد تؤثر على أداء الموقع وذلك لإزدياد حجمها مثلاً ويعد ذلك من العيوب أيضاً, فلذلك يفضل ان نستخدمها للكميات الصغيرة من البيانات . 
 
إدارة وقت التعديل :
 
حيث أنها ذات طابع عمل عام , ماذا سيحدث إن تم التعديل فى وقت واحد لهذا الكائن من أكثر من مستخدم , على سبيل المثال , لدينا كائن Application يقوم بحساب عدد الزوار ,وبالطبع سيزيد هذا المتغير (أو الكائن ) عند بداية Session جديدة . أى عند إتصال زائر جديد للموقع, فيمكن أن يتم إتصال اكثر من واحد فى نفس الوقت, فعندها سيكون على التطبيق ان يعمل على زيادة هذا المتغير (نقصد به عدد الزوار فى هذة الحالة ) فى نفس الوقت مما قد يسبب المشكلات , لذا وجد هناك طريقة لإيقاف التعديل سواؤ زيادة او نقصان عند وجود تعديل يجرى ,بمعنى آخر عدم السماح إلا بإجراء تعديل واحد فى نفس الوقت , وهذة الطريقة هى إستخدام 
Application.Lock() و عند الإنتهاء Application.Unlock() .و تسمى هذة العملية بـ Thread-Safe .
 
تخزين بيانات :
 
عندما قلنا انه عام يراه كل المستخدمين ,ومتاح لهم التحرير (إضافة,إستخدام, حذف) . وحيث انه عام لايمكن ان نقوم بإعطائه القيمة الإبتدائية مثلاً فى صفحة ما او ان يقول شخص أن نعرفه فى الصفحة الرئيسية ,هذا مخالف تماماً, لإن كل الصفحات لها دورة حياة Life Cycle لها أحداثها, يتم تكرارهذة الدورة (الأحداث) عند بداية تحميل هذة الصفحة فى أى وقت ومع أى مستخدم. لذلك وجب وجود مكان عام لإعطاء القيمة الإبتدائية لهذا الكائن ! , فنجد أن ملف Global.asax يوفر لنا أداء المهمة , ولكن أين بالتحديد داخل هذا الملف ,فنجد داخل هذا الملف حدث يتم تنفيذه مرة واحدة فقط . عند أول زيارة للموقع ,وهو Application_Start فيتم تعريف ما يسمى بـInstance من الــClass الرئيسى HttpApplicationState (هذا ما نطلق عليه تعريف من Object من class ما , أيضاً يسمى Instance ). وبعدها يمكن أن نستخدم هذة النسخة التى تم تعريفها لتخزين القيم بداخلها ,وذكرنا من قبل شيئاً عن Dictionary (Key/Value ) , نعم يجب وجود إسماً وقيمة .فالإسم هو الذى يتم طلب البيانات به ولابد أن يكون مميز غير متكرر (لايمكن إعادة إستخدامه). أما القيمة فهى الناتج المقصود من تللك العملية . ولابد أن ننوه انه يتم إنهاء هذا المتغير وضياع القيم التى به عند تنفبذ الحدث Application_End الموجود فى نفس الملف ويتم تنفيذه فقط عند إنهاء عمل التطبيق. 
 
قاعدة بناء الجملة : 
 
 
Application[Key] = Value ;
 
Application ----- هو المتغير العام الذى سنعمل به .
 
Key ----- هو الإسم المميز لهذا المتغير ويمكن ان يكون قيمة نصية بين علامات التنصيص " ", مثال Application["Counter"] او أن يعمل بطريقة Index ويبداً من الصفر إلى ماشاء الله , مثال Application[0] . 
 
ملحوظة : رواد vb.net يمكنهم فقط تبديل الإقواس بـ( ) مثال Application("counter") .
 
Value ----- هى القيمة المخزنة ويمكن أن تكون من أى نوع . 
 
كتابة بيانات به : 
 
Application["counter"] = 1 ;
أو 
Application[0]= "Welcome to ASP.Net " ; 
 
وكما ذكرنا لضمان ما تم تعريفه بـ Thread-Safe , يجب إستخدام التالى : 
 
Application.Lock();
Application["Counter"] = (int)Application["Counter"] + 1;
Application.UnLock();
 
قراءة بيانات منه :
 
يجب التنبيه على التالى :
- يجب التأكد من أن هناك متغير قد تم تعريفه من قبل فى البداية, ويمكن ذلك بالكشف ما إذا كان فارغ ام لا , كالتالى
 
 
if (Application["Counter"] != null)
{
// do something 
}
 
- كذلك يجب التحويل إلى نوع الجهة المقصودة , وذلك لإن القيمة المسترجعة تعود من النوع الرئيسى لكل الإنواع وهو Object .
 
MessageLabel.Text = Application["Counter"].ToString();
 
مثال : 
 
لنأخذ عداد المتواجدين حالياً كمثالاً للعمل لتوضيح بعض الأمور , وهى 
- يجب ان تعطى قيمة إبتدائية للمتغير Application يبدأ بها العداد ويتم تعريف إسم لهذا المتغير (Key)
- يجب ان يزداد بقيمة واحد فى كل مرة يتم زيارة الموقع ككل وليس صفحة واحدة.
- يجب ان ينقص بقيمة واحد عند ترك الزائر للموقع .
 
إنجاز هذا العمل يتطلب منا معرفة متى يدخل المستخدم ومتى يخرج, وليس الأمر بالصعب مع وجود احداث Session المتواجدة فى ملف Global.asax والتى تحدد دخول المستخدم إلى الموقع من خلال الحدث Session_Start عند بداية Session جديدة . وأيضاً عند خروجه فى حدث Session_End ,
 
 
محلوظة :
يجب مراعاة أن هذا الحدث Session_End يعمل مع الوضع الإفتراضى للـ Session ونقصد وضع التخزين لمتغيرات Session وهذا الوضع هو InProc وهو إختصار In Process ونعنى به تخزين قيم هذة المتغيرات فى ذاكرة الحاسب .ولإكتمال المعلومة الأوضاع الإخرى هى للتخزين فى قواعد البيانات أو ذاكرة خادم أخر أو إغلاق ومنع تخزين هذة المتغيرات او متروكه للمستخدم يحدد وسيلة التخزين.
 
 
الكود المستخدم : 
 
<%@ Application Language="C#" %>
 
<script runat="server">
 
    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
        Application["OnlineVistiors"] = 0;
    }
    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started
        Application.Lock();
        Application["OnlineVistiors"] =(int) Application["OnlineVistiors"] + 1;
        Application.UnLock();
    }
 
    void Session_End(object sender, EventArgs e) 
    {
// Code that runs when a session ends. 
        Application.Lock();
        Application["OnlineVistiors"] = (int)Application["OnlineVistiors"] - 1;
        Application.UnLock();
    }
       
</script>
 
الخطوة التالية: 
 
- إظهار الناتج فى الصفحة الرئيسية للمستخدمين :
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Application["OnlineVistiors"] != null)
        {
            OnlineVisitorsLabel.Text = Application["OnlineVistiors"].ToString();
        }
    }
 
ختام :
 
كانت هذة نبذة , رأيت مثالآ لأستاذ كريم , طيب الإخلاق يريد أن ينفع الإخرين ولكن رأيته يحتاج إلى المزيد , فحرك بداخلى الحماسة ,فكتبت هذا الدرس فى ربما ساعة أو أقل . فأرجوا ألا يكون به تقصير . ووفقكم الله .والسلام عليكم ورحمة الله .
 
عن الكاتب :
Ahmed Moosa 
MCTS/MCPD
Web Developer 
ASP.Net Trainer 
 
 
إعلان ... لأصحاب المتجار فقط - برنامج تنفيذي وليس سورس كود
تحميل برنامج مبيعات وجرد المستودعات

 
 
الصفحة الرئيسية
خوارزميات التشفير English
خوارزميات التشفير العربية
تصميم مشاريع التخرج
تصميم المواقع الإلكترونية
تصميم وإنتاج البرمجيات
مشاريع برمجة متنوعة مفتوحة المصدر
دورة برمجة وتصميم مواقع الكترونية
مواضيع ودروس تعليمية
مواضيع ومقالات عامة
إذاعة القرآن الكريم
اتصل بنا
نبذة عن هذا الموقع
خارطة الموقع
نظام إدارة المبيعات