التنبيهات التالية ظهرت :
Warning [2] count(): Parameter must be an array or an object that implements Countable - Line: 864 - File: showthread.php PHP 7.4.33 (Linux)
File Line Function
/showthread.php 864 errorHandler->error



تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تعلم كيف تستخدم Application Objects
#1
كاتب الموضوع : Ahmed Moosa


السلام عليكم

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.spaanjaars.com/164/howto...ng-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 الموجود فى نفس الملف ويتم تنفيذه فقط عند إنهاء عمل التطبيق.

قاعدة بناء الجملة :


كود :
[color=#000000][COLOR=#0000bb]Application[/color][color=#007700][[/color][color=#0000bb]Key[/color][color=#007700]] = [/color][color=#0000bb]Value [/color][COLOR=#007700];  
[/COLOR][color=#0000bb][/color][/COLOR]

Application ----- هو المتغير العام الذى سنعمل به .

Key ----- هو الإسم المميز لهذا المتغير ويمكن ان يكون قيمة نصية بين علامات التنصيص " ", مثال

كود :
[color=#000000][COLOR=#0000bb] Application[/color][color=#007700][[/color][color=#dd0000]"Counter"[/color][COLOR=#007700]]  
[/COLOR][color=#0000bb][/color][/COLOR]

او أن يعمل بطريقة Index ويبداً من الصفر إلى ماشاء الله , مثال

كود :
[color=#000000][COLOR=#0000bb] Application[/color][color=#007700][[/color][color=#0000bb]0[/color][COLOR=#007700]]  .  
[/COLOR][color=#0000bb][/color][/COLOR]

ملحوظة : رواد vb.net يمكنهم فقط تبديل الإقواس بـ( ) مثال Application("counter") .

Value ----- هى القيمة المخزنة ويمكن أن تكون من أى نوع .

كتابة بيانات به :


كود :
[color=#000000][COLOR=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"counter"[/color][color=#007700]] = [/color][color=#0000bb]1 [/color][COLOR=#007700];  
[/COLOR][color=#0000bb][/color][/COLOR]

أو


كود :
[color=#000000][COLOR=#0000bb]Application[/color][color=#007700][[/color][color=#0000bb]0[/color][color=#007700]]= [/color][color=#dd0000]"Welcome to  ASP.Net " [/color][COLOR=#007700];  
[/COLOR][color=#0000bb][/color][/COLOR]

وكما ذكرنا لضمان ما تم تعريفه بـ Thread-Safe , يجب إستخدام التالى :


كود :
[color=#000000][COLOR=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]Lock[/color][COLOR=#007700]();
[/COLOR][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"Counter"[/color][color=#007700]] = (int)[/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"Counter"[/color][color=#007700]] + [/color][color=#0000bb]1[/color][COLOR=#007700];
[/COLOR][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]UnLock[/color][COLOR=#007700]();  
[/COLOR][color=#0000bb][/color][/COLOR]

قراءة بيانات منه :
يجب التنبيه على التالى :
- يجب التأكد من أن هناك متغير قد تم تعريفه من قبل فى البداية, ويمكن ذلك بالكشف ما إذا كان فارغ ام لا , كالتالى

كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]if ([/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"Counter"[/color][color=#007700]] != [/color][color=#0000bb]null[/color][COLOR=#007700])
{
[/COLOR][COLOR=#ff8000]// do something  
[/COLOR][COLOR=#007700]}  
[/COLOR][color=#0000bb][/color][/COLOR]

- كذلك يجب التحويل إلى نوع الجهة المقصودة , وذلك لإن القيمة المسترجعة تعود من النوع الرئيسى لكل الإنواع وهو Object .

كود :
[color=#000000][COLOR=#0000bb]MessageLabel[/color][color=#007700].[/color][color=#0000bb]Text [/color][color=#007700]= [/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"Counter"[/color][color=#007700]].[/color][color=#0000bb]ToString[/color][COLOR=#007700]();  
[/COLOR][color=#0000bb][/color][/COLOR]

مثال :

لنأخذ عداد المتواجدين حالياً كمثالاً للعمل لتوضيح بعض الأمور , وهى
- يجب ان تعطى قيمة إبتدائية للمتغير Application يبدأ بها العداد ويتم تعريف إسم لهذا المتغير (Key)
- يجب ان يزداد بقيمة واحد فى كل مرة يتم زيارة الموقع ككل وليس صفحة واحدة.
- يجب ان ينقص بقيمة واحد عند ترك الزائر للموقع .

إنجاز هذا العمل يتطلب منا معرفة متى يدخل المستخدم ومتى يخرج, وليس الأمر بالصعب مع وجود احداث Session المتواجدة فى ملف Global.asax والتى تحدد دخول المستخدم إلى الموقع من خلال الحدث Session_Start عند بداية Session جديدة . وأيضاً عند خروجه فى حدث Session_End ,


محلوظة :يجب مراعاة أن هذا الحدث Session_End يعمل مع الوضع الإفتراضى للـ Session ونقصد وضع التخزين لمتغيرات Session وهذا الوضع هو InProc وهو إختصار In Process ونعنى به تخزين قيم هذة المتغيرات فى ذاكرة الحاسب .ولإكتمال المعلومة الأوضاع الإخرى هى للتخزين فى قواعد البيانات أو ذاكرة خادم أخر أو إغلاق ومنع تخزين هذة المتغيرات او متروكه للمستخدم يحدد وسيلة التخزين.


الكود المستخدم :

كود :
[color=#000000][COLOR=#0000bb][/color][color=#007700]<%@ [/color][color=#0000bb]Application Language[/color][color=#007700]=[/color][color=#dd0000]"C#" [/color][COLOR=#007700]%>

<[/COLOR][color=#0000bb]script runat[/color][color=#007700]=[/color][color=#dd0000]"server"[/color][COLOR=#007700]>

    [/COLOR][color=#0000bb]void Application_Start[/color][color=#007700]([/color][color=#0000bb]object sender[/color][color=#007700], [/color][color=#0000bb]EventArgs e[/color][COLOR=#007700])  
    {
        [/COLOR][COLOR=#ff8000]// Code that runs on application startup
        [/COLOR][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] = [/color][color=#0000bb]0[/color][COLOR=#007700];
    }
    [/COLOR][color=#0000bb]void Session_Start[/color][color=#007700]([/color][color=#0000bb]object sender[/color][color=#007700], [/color][color=#0000bb]EventArgs e[/color][COLOR=#007700])  
    {
        [/COLOR][COLOR=#ff8000]// Code that runs when a new session is started
        [/COLOR][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]Lock[/color][COLOR=#007700]();
        [/COLOR][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] =(int) [/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] + [/color][color=#0000bb]1[/color][COLOR=#007700];
        [/COLOR][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]UnLock[/color][COLOR=#007700]();
    }

    [/COLOR][color=#0000bb]void Session_End[/color][color=#007700]([/color][color=#0000bb]object sender[/color][color=#007700], [/color][color=#0000bb]EventArgs e[/color][COLOR=#007700])  
    {
[/COLOR][COLOR=#ff8000]// Code that runs when a session ends.  
        [/COLOR][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]Lock[/color][COLOR=#007700]();
        [/COLOR][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] = (int)[/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] - [/color][color=#0000bb]1[/color][COLOR=#007700];
        [/COLOR][color=#0000bb]Application[/color][color=#007700].[/color][color=#0000bb]UnLock[/color][COLOR=#007700]();
    }
        
[/COLOR][color=#0000bb]</script>[/color]  
[/COLOR]

الخطوة التالية:
- إظهار الناتج فى الصفحة الرئيسية للمستخدمين :

كود :
[color=#000000][COLOR=#0000bb]    [/color][color=#007700]protected [/color][color=#0000bb]void Page_Load[/color][color=#007700]([/color][color=#0000bb]object sender[/color][color=#007700], [/color][color=#0000bb]EventArgs e[/color][COLOR=#007700])
    {
        if ([/COLOR][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]] != [/color][color=#0000bb]null[/color][COLOR=#007700])
        {
            [/COLOR][color=#0000bb]OnlineVisitorsLabel[/color][color=#007700].[/color][color=#0000bb]Text [/color][color=#007700]= [/color][color=#0000bb]Application[/color][color=#007700][[/color][color=#dd0000]"OnlineVistiors"[/color][color=#007700]].[/color][color=#0000bb]ToString[/color][COLOR=#007700]();
        }
    }  
[/COLOR][color=#0000bb][/color][/COLOR]

ختام :

كانت هذة نبذة , رأيت مثالآ لأستاذ كريم , طيب الإخلاق يريد أن ينفع الإخرين ولكن رأيته يحتاج إلى المزيد , فحرك بداخلى الحماسة ,فكتبت هذا الدرس فى ربما ساعة أو أقل . فأرجوا ألا يكون به تقصير . ووفقكم الله .والسلام عليكم ورحمة الله .
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
تعلم كيف تستخدم Application Objects - بواسطة Raggi Tech - 15-10-12, 11:10 AM


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم