الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعلم كيف تتعامل مع Application Objects

بدأه Ahmed Moosa في 11 يناير 2011 · 4 رد · 2,097 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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.spaanjaars.com/164/howto-create-a-hit-counter-using-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

تم تعديل هذه المشاركة بواسطة Ahmed Moosa في 11 يناير 2011 في 14:32

1

Ahmed Moosa

Microsoft Community Contributor | MCC

Microsoft Certified Professional Developer | MCPD

Microsoft Certified Technology Specialist | MCTS

Senior .NET Developer

.Net Trainer

English blog : http://weblogs.asp.net/ahmedmoosa/

مدونة عربى : http://ahmedmoosa.wordpress.com/

#2

جزاك الله خيرا على هذا المجهود ووفقك الله للأمام

وصراحة تعجبت عندما رأيتها بدون أي رد ولو حتى كلمة شكرا فقط من الأعضاء!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

الله أكبر الله أكبر الله أكبر لآ إله إلا الله الله أكبر الله أكبر ولله الحمد

#3

اشكرك احمد جزاك الله الف خير

انا فعلا استفدت من هذا الموضوع وطبقته وكان اول تعامل لي مع Global.asax

ودائما كنت اتسال عن فائدة Global.asax وياليت لو تعطينا ملخص بسيط عنه

وكذلك اتسال هل استطيع من خلال Global.asax ان اغلق جميع اتصالات الكلاينت بقاعدة البيانات عند خروجه

#4

الله يجزيك الخير أخي معلومات جيدة .................

قل لمن يحمل هما ****** إن همــــا لا يدوم
:rolleyes: :rolleyes: :clapping: :rolleyes: :rolleyes:

مثلا تفنى المسـرة ***** هكذا تفنى الهموم

#5

موضوع مميز ..

كل الشكر لك

مدونتي الشخصية

http://omjana1.wordpress.com/

مدونة أجمع فيها دروسي التي كتبتها في مجال السي شارب دوت نت

مواضيع مشابهة