• 0
VB Helper

تطبيق MVP Pattern في الـ ASP.NET باستخدام الـ WebFormsMvp

سؤال

السلام عليكم ورحمه الله وبركاته

في البداية اريد ان اشكر الاخ Ahmed Mossa على نشاطه الفعال في قسم الـ ASP.NET, ولقد تطرق في درسه الاخير عن تطبيق النمط MVP في تقنية الـ ASP.NET. كما اريد ان انوه للقراء الذين لا يعرفوا ماهو النمط MVP بقراءة الدرس السابق اولا الموجود في الرابط التالي تعلم كيف تستخدم MVP Pattern فى ASP.Net من ثم الرجوع لقراءة درسي عن امكانية تطبيق الـ MVP Pattern باستخدام الـ WebFormsMvp.

قبل ان استهل درسي المتواضع دعونا نتذكر ماهي الطرق المتوفرة حاليا لهيكلة وبناء تطبيقات باستخدام تقنية الـ ASP.NET, بالتأكيد اولها الـ WebForms ومن ثم الـ MVC وطبعا هذين الشائعين ولا ننسى الـ WebPags باستخدام الاداة المجانية Web Matrix.

الـ WebForms ومن منا لايعرف هذه الهيكلية التي تتيح لنا بناء تطبيقات باستخدام مجموعة من الادوات والمكونات الموفرة من قبل تقنية الـ ASP.NET في وقت قياسي, وفي الجانب نرى الـ MVC التي قدمت نمط جديد لهيكلية تطبيقات الـ ASP.NET وذلك باستخدم الـ Model - View - Controller طبعا لن اتطرق لها لأنه قد تم ذكرها في دروس عدة في هذا القسم. طبعا لو اردنا المقارنة بين الطريقتين السابقتين يمكننا المقارنه كـ Productivity Vs. Control فنلاحظ ان الـ WebForm اكثر انتاجية فيمكنك استخدام الادوات الموفرة مثل الـ GridView و الـ FormView وغيرهما لبناء تطبيقات غنية في وقت قياسي جدا هذا هو المقصود بالانتاجية!! وعلى الجانب الاخر نلاحظ ان الـ MVC اكثر تحكما, اكثر تحكم بالكود والـ Urls واكثر تحكما على البيئة نفسها. واريد ان انوه على شيء يغفل عنه جميع مطوري الـ ASP.NET التطبيق الاكثر استخدام للـ Drag Drop هو التطبيق الاكثر صيانة؟!!

ماهي الـ WebFormsMvp؟ وماهي فوائدها؟

الـ WebFormsMvp ما هو الا مشروع مفتوح المصدر, اتى نظرا لإضمحلال الـ WebForms في الفترات الاخير وتوجه المطورين للـ MVC , ومن المنطلق السابق بين الانتاجية و التحكم اتى هذا المشروع ليوازن بين الانتاجية والتحكم فيمكننا الان بناء تطبيقات باستخدام الـ WebForms والادوات الموفرة ليتم انتاج تطبيق في وقت قياسي ولا ننسى انه يستخدم النمط MVP والذي يمكننا من خلال التحكم بالكود. فسنلاحظ ان التطبيق سيكون اكثر انتاجا واكثر تحكما وليس هذا فقط فهو قابل لمعالجة الاخطاء و للإختبار باستخدام ادوات الاختبار مثل الـ Test Unit والـ NUnit وغيرهما. بالطبع هذا المشروع قام بإنعاش الـ WebForms من جديد لتكون منافس جيد للـ MVC.

كيفية استخدام الـ WebFormsMvp؟

سنقوم الآن بالتطرق لمثال بسيط يوضح كيفية استخدام الـ WebFormsMvp في تطبيقاتنا, طبعا سأقوم بعمل المثال الذي ذكره الاخ Ahmed Mossa سابقا لبساطته كما سوف أقوم بتطويره قليلا, وطبعا سأستخدم السي شارب ليس محبة فيها!! ههه اعذروني فأنا افضل الفيجوال بيسك كثيرا, لكن مضطر لأن المثال السابق مكتوب بالسي شارب ولئلا يحصل لبس. فهل انتم مستعدون لرحلتنا؟

لنقوم بانشاء تطبيق ويب ولنسميه مثلا MVP, طيب او ل سؤال سيتبادر لنا كيف ومن اين احصل على هذا المشروع؟ يمكننا الحصول على المشروع والتعرف عليه من خلال الرابط التالي WebFormsMvp, كما يمكننا الحصول عليه ببساطه باستخدام الأداة NuGet والتي تساعدنا للحصول على المشاريع المفتوحة المصادر المتاحة لتقنية الـ ASP.NET ببساطه, ما علينا فعله الا فتح محرر مدير الحزم Package Manager Console من القائمة View ومنها Other Windows, بعدها ماعلينا الاكتابة الامر التالي

Install-Package WebFormsMvp

الآن نحن مستعدين للبدء بإنشاء قاعدة البيانات والـ Data Access Layer طبع كما ذكرت سابقا للبساطه سنستخدم Static List كقاعدة بيانات لمشروعنا لصغره ولقلة اهمية موضوع قواعدة البيانات في هذا الدرس, طبعا مو مشكلة يمكننا تغييرها في اي وقت بدون اي عناء او تغيير جذري للتطبيق و سأترك الامر للتجربة!! طبعا قاعدة البيانات ما هي إلا قائمة او جدول من الفئة Person. فطبقة الـ Data Access ستكون كالتالي


public class Person
{
public string Name { set; get; }
public string Job { set; get; }
public int Age { set; get; }
}

طبعا الفئة ليست بغريبة علينا عدا انني قمت بتعديل نوع البيان للعمر الى عدد صحيح

 public interface IPersonRepository
{
List<Person> FindAll();
List<Person> FindByName(string name);
}

طبعا هذا ما هو عبارة الا عن واجهة سيتم تطبيقها لاحقا لأنه من المعروف ان مصدر البيانات والذي سيحتوي على أشخاص PersonRepository لابد ان يقدم بعض الوظائف الأساسية وحسب المثال السابق سيقدم الطريقتين FindAll و FindByName للبحث عن الكل او البحث حسب الاسم


public class PersonRepository:IPersonRepository
{
public List<Person> FindAll()
{
return new List<Person>() {
new Person { Name="Ahmed",Age =28, Job ="Trainer"},
new Person { Name="Ali",Age =35, Job ="Analyst"},
new Person { Name="Amgad",Age =32, Job ="Leader"},
new Person { Name="Ahmed",Age =21, Job ="Progarmer"}
} ;
}
public List<Person> FindByName(string name)
{
return FindAll().Where(p => p.Name == name).ToList();
}
}

سنلاحظ في الفئة السابقة انه تم تطبيق الواجهه IPersonRepository ليتم تعريف الطريقتين السابقتين, وطبعا اعتقد لا توجد صعوبه الاجراء الاول يقوم بإعادة قائمة من الاشخاص, ام الاجراء الثاني يقوم باستخدام الاجراء السابق ليتم الفلترة حسب الاسم وتم استخدام الـ Lambda Expressions, اعتقد لا شيء اعجازي. لا ننسى اننا نستخدم الـ MVP لذا يجب علينا تطبيق كلا من الـ Model, View, Presenter وهذا ما سنفعله الآن

Model

وهنا سوف نقوم بتعريف النموذج او القالب الذي يمثل الـ PeopleList

public class PersonListModel
{
public IEnumerable<Person> People { get; set; }
public DateTime Time { get; set; }
public string SearchTerm { get; set; }
}

فقد قمنا بتعريف فئة بالاسم PersonListModel والتي تضم بدورها الخواص التاليه

People والتي تمثل الاشخاص وهي من النوع IEnumerable of Person لأنها حقيقة مجموعة مكونة اساسا من الفئة Person ولها القابلية للـ Iteration اي استعراض كل العناصر داخلها باستخدام الـ Foreach

Time والتي تمثل الوقت الذي تم فيه استرجاع البيانات من قاعدة البيانات وهو اكيد من النوع DateTime

SearchTerm والذي يمثل النص المراد البحث عنه - طبعا سأستخدمه في كلا الحالتين - في الـ FindAll و الـ FindByName

View

وهنا سوف نقوم بتعريف الواجهه والتي ستستخدم الـ Model لجلب البيانات وعرضها طبعا بالتأكيد عبر الـ Presenter


public interface IPersonListView:IView<PersonListModel>
{
event EventHandler GettingPeople;
}

وهنا تم تعريف الواجهه والتي تحتوي بدورها على الحدث GettingPeople والذي يمثل حدث الحصول على الاشخاص, ولكن لنتمعن جيد في الواجهه السابقة .. هل تلاحظ شيء؟!! بالتأكيد IView وما هي الا عبارة عن واجهه موفرة من قبل المشروع علينا استخدامها لأنشاء اي View وطبعا في واجهتنا السابقه من نوع PersonListModel؟!! ما هذا الكلام .. ليش التعقيد والصعوبات!! تمهل سنعرف اهميتها لاحقا ويمكن تكتشفها بنفسك, طبعا هنا يكون نوع الواجهه IView من نفس نوع الـ Model المستخدم وفي حالتنا PersonListModel

Presenter

اخيرا وليس اخرا سنقوم بتعريف الـ Presenter وهو الـ Controller بين الـ Model و الـ View


public class PersonListPresenter:Presenter<IPersonListView>
{
private readonly IPersonRepository _repository;

public PersonListPresenter(IPersonListView view, IPersonRepository repository)
: base(view)
{
_repository = repository;
view.GettingPeople += new EventHandler(GettingPeople);
}

void GettingPeople(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(View.Model.SearchTerm))
View.Model.People = _repository.FindAll();
else
View.Model.People = _repository.FindByName(View.Model.SearchTerm);
View.Model.Time = DateTime.Now;
}
}

وهنا قمنا بتعريف فئة تستخدم Presenter من نوع IPersonListView ماهذا؟؟ لا تخف نفس الشي الفئة Presenter ما هي الا فئة تم توفيرها من ضمن البيئة لتعريف الـ Presenter وفي مثالنا من النوع IPersonList, فضلا ركز هنا محك الفرس, ذكرنا سابقا الواجهه IView وهي من نوع PersonListModel والان الفئة Presenter وهي من نوع IPersonListView فسنلاحظ ان البيئة وفرة علينا الكثير .. كيف؟ لا داعي لتعريف كائن من نوع View مثلا في الـ Presenter كما كان في الدرس السابق, والشيء الاهم سنلاحظ يمكنك الان الوصول للـ Model من خلال الـ View وكذلك الوصول للـ View من خلال الـ Presenter بدون اي جهد مسبقا, كيف؟؟ سنرى الآن, ففس الفئة السابقة قمنا بنعريف كائن من نوع IPersonRepository للوصول للإجرائن السابقين FindAll و FindByName ومن ثم قمنا بتعريف Constructor والذي تم تمرير كائن من نوع IPeronListView والذي يمثل الواجهه وكائن من النوع IPersonRepository والذي يمثل والواجهه الاساسية للـ PersonRepository. وبعدها تم تعريف الحدث GettingPeople والذي فعليا يقوم بفحص الخاصية SearchTerm ليتم تنفيذ الاجراء FindAll اذا كان خالي القيمة او الاجراء FindByName, لنرجع قليل لقد تم الوصول للخاصية السابقه من خلال View.Model.SearchTerm هنا تكمن احد ميزات البيئة كما اشرنا سابقا انه يمكنك الوصول للـ View من خلال الـ Presenter وهو نفس الحال للـ Model. وطبعا قمنا بضبط الخاصيتين People و Time اعتقد انني خضت في تفاصيل التفاصيل .. سأترك البقية لكم

انتهينا من الـ MVP والان سيأتي دور بناء UserControl لإستخدام الواجهه IPersonList واعتقد لا شيء اعجازي سأترك الجزء هذا للقراءة من المشروع المرفق, واذا يوجد اي استفسار او سؤال لا تترددوا بالسؤال, طبعا هذا ليس كل شيء بالنسبة للـ WebFormsMvp يمكنكم اكتشاف المزيد المزيد

MVP.zip

تم تعديل بواسطه VB Helper
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

فى البداية ,أود أن شكرك د/VB Helper ,على مشاركتك هذة , و لها عدة منافع :-

1- أولها ,وهكذا يجب أن نكون ,إكمال المسيرة, شخص بدأ , الثانى يكمل .فحياك الله على هذا .

2- ثانيها:- جعلتنى أقرر أن أكتب درساً لنكمل ما بداناه سوياً فى هذا الموضوع .

3- ثالثها , لا أذكر .

على هامش الموضوع :- شعورك تجاه #C قد يكون نفس شعورى تجاه VB , الحقيقة , أشعر ببغض شديد تجاهه (mad.gif).هههههههههه .

نفع الله بك .

تم تعديل بواسطه Ahmed Moosa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركاته

لاشكر على واجب اخي العزيز وارجو من بقية الاعضاء التفاعل وطرح مواضيع نفيد بها الاسلام والمسلمين, اما بخصوص السي شارب انا لا اكرهها ذاك الكره بالعكس الكثير يشاهدوا العكس ولكن حقيقة انا افضل الفيجوال البيسك, وطبعا لن اطيل الجدال, ان شاء الله وصلت المعلومة من الدرس السابق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

انا عملت على MVC و MVVM وكمن اعتقد ان الامر لا يختلف كثيرا لكني ارى انه هناك اكواد في سورس usercontrol عكس ما اجده فى MVVM ارجوا التوضيح اكثر بمثال اقل لنعرف دور كل مرحلة شكرا

على العموم ساحاول من جهتي التوصل الى نتيجة

هده صورة توضيحية لما دكرتموه سابقا

post-1034-021425200 1326379648_thumb.jpg

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركاته

اخي طبيعة البيئة ان تقوم بعمل UserControl يقوم بالوراثة من MVPUserControl وتطبيق الواجهه View

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لم افهم ما تقصده ارجوا ان تفهنى من الصفر لاني مبتدا معكم هنا شكرا

سؤالى هو

من تعرف الاخ حيث قال

View

يقصد بها صفحة كود التصميم ,وما هى إلا الصفحة العادية التى تعرفها والتى تحتوى على أدوات الصفحة .وتمثله فى الكود الصفحة ذات الإمتداد aspx او ascx .

و انا معه في هدا لانه يجب فصل view عن السورس لكي يستطيع مبرمج الواجهة العمل منفردا.

لكني الاحض انكم كتبتم اكواد #c في VIEW

شكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لم افهم ما تقصده ارجوا ان تفهنى من الصفر لاني مبتدا معكم هنا شكرا

سؤالى هو

من تعرف الاخ حيث قال

و انا معه في هدا لانه يجب فصل view عن السورس لكي يستطيع مبرمج الواجهة العمل منفردا.

لكني الاحض انكم كتبتم اكواد #c في VIEW

شكرا

بارك الله بكم, ألا ترى معنا انه من المنطق أن يكون هناك وسيلة إتصال بين الجميع ؟! , نعم ننشأ view على هيئة Interface لتمثل الصفحة التى سنقوم بالعمل معها . وبالتالى ,فإنها لن تحتوى إلا على أحداث ودوال وخصائص . وهذة الإحداث والدوال والخصائص , سنعمل على معالجتها فى الـ Presenter ولكن من سيقوم بإعطائها الأمر بالتنفيذ هو User Interface أى صفحة ASPX او ASCX .

يمكنك التمهل حتى الساعات القادمة القليلة , وسترى إن شاء الله مثال مبسط مفصل (أرجو ان يكون مفصل ).

والسلام عليكم

تم تعديل بواسطه Ahmed Moosa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .