۱۳۹۱/۰۱/۰۴

ASP.NET MVC #2


MVC‌ چيست و اساس كار آن چگونه است؟

الگوي MVC در سال‌هاي اول دهه 70 ميلادي در شركت زيراكس توسط خالقين زبان اسمال‌تاك كه جزو اولين زبان‌هاي شيءگرا محسوب مي‌شود، ارائه گرديد. نام MVC از الگوي Model-View-Controller گرفته شده و چندين دهه است كه در صنعت توليد نرم افزار مورد استفاده مي‌باشد. هدف اصلي آن جدا سازي مسئوليت‌هاي اجزاي تشكيل دهنده «لايه نمايشي» برنامه است.
اين الگو در سال 2004 براي اولين بار در سكويي به نام Rails به كمك زبان روبي جهت ساخت يك فريم ورك وب MVC مورد استفاده قرار گرفت و پس از آن به ساير سكوها مانند جاوا، دات نت (در سال 2007)، PHP و غيره راه يافت.
تصاويري را از اين تاريخچه در ادامه ملاحظه مي‌كنيد؛ از دكتر Trygve Reenskaug تا شركت زيراكس و معرفي آن در Rails به عنوان اولين فريم ورك وب MVC.


C در MVC معادل Controller است. كنترلر قسمتي است كه كار دريافت ورودي‌هاي دنياي خارج را به عهده دارد؛ مانند پردازش يك درخواست HTTP ورودي.


زمانيكه كنترلر اين درخواست را دريافت مي‌كند، كار وهله سازي Model را عهده دار خواهد شد و حاوي اطلاعاتي است كه نهايتا در اختيار كاربر قرار خواهد گرفت تا فرآيند پردازش درخواست رسيده را تكميل نمايد. براي مثال اگر كاربري جهت دريافت آخرين اخبار به سايت شما مراجعه كرده است،‌ در اينجا كار تهيه ليست اخبار بر اساس مدل مرتبط به آن صورت خواهد گرفت. بنابراين كنترلرها، پايه اصلي و مدير اركستر الگوي MVC محسوب مي‌شوند.
در ادامه، كنترلر يك View را جهت نمايش Model انتخاب خواهد كرد. View در الگوي MVC يك شيء ساده است. به آن مي‌توان به شكل يك قالب كه اطلاعاتي را از Model دريافت نموده و سپس آن‌ها را در مكان‌هاي مناسبي در صفحه قرار مي‌دهد، نگاه كرد.
نتيجه استفاده از اين الگو، ايزوله سازي سه جزء ياد شده از يكديگر است. براي مثال View نمي‌داند و نيازي ندارد كه بداند چگونه بايد از لايه دسترسي به اطلاعات كوئري بگيرد. يا براي مثال كنترلر نيازي ندارد بداند كه چگونه و در كجا بايد خطايي را با رنگي مشخص نمايش دهد. به اين ترتيب انجام تغييرات در لايه رابط كاربري برنامه در طول توسعه كلي سيستم، ساده‌تر خواهد شد.
همچنين در اينجا بايد اشاره كرد كه اين الگو مشخص نمي‌كند كه از چه نوع فناوري دسترسي به اطلاعاتي بايد استفاده شود. مي‌توان از بانك‌هاي اطلاعاتي، وب سرويس‌ها، صف‌ها و يا هر نوع ديگري از اطلاعات استفاده كرد. به علاوه در اينجا در مورد نحوه طراحي Model نيز قيدي قرار داده نشده است. اين الگو تنها جهت ساخت بهتر و اصولي «رابط كاربري» طراحي شده است و بس.



تفاوت مهم پردازشي ASP.NET MVC با ASP.NET Web forms

اگر پيشتر با ASP.NET Web forms كار كرده باشيد اكنون شايد اين سؤال برايتان وجود داشته باشد كه اين سيستم جديد در مقايسه با نمونه قبلي، چگونه درخواست‌ها را پردازش مي‌كند.


همانطور كه مشاهده مي‌كنيد، در وب فرم‌ها زمانيكه درخواستي دريافت مي‌شود، اين درخواست به يك فايل موجود در سيستم مثلا default.aspx ارسال مي‌گردد. سپس ASP.NET يك كلاس وهله سازي شده معرف آن صفحه را ايجاد كرده و آن‌را اجرا مي‌كند. در اينجا چرخه طول عمر صفحه مانند page_load و غيره رخ خواهد داد. جهت انجام اين وهله سازي، View به فايل code behind خود گره خورده است و جدا سازي خاصي بين اين دو وجود ندارد. منطق صفحه به markup آن كه معادل است با يك فايل فيزيكي بر روي سيستم، كاملا مقيد است. در ادامه، اين پردازش صورت گرفته و HTML نهايي توليدي به مرورگر كاربر ارسال خواهد شد.
در ASP.NET MVC اين نحوه پردازش تغيير كرده است. در اينجا ابتدا درخواست رسيده به يك كنترلر هدايت مي‌شود و اين كنترلر چيزي نيست جز يك كلاس مجزا و مستقل از هر نوع فايل ASPX ايي در سيستم. سپس اين كنترلر كار پردازش درخواست رسيده را شروع كرده، اطلاعات مورد نياز را جمع آوري و سپس به View ايي كه انتخاب مي‌كند، جهت نمايش نهايي ارسال خواهد كرد. در اينجا View اين اطلاعات را دريافت كرده و نهايتا در اختيار كاربر قرار خواهد داد.



آشنايي با قرارداد يافتن كنترلرهاي مرتبط

تا اينجا دريافتيم كه نحوه پردازش درخواست‌ها در ASP.NET MVC بر مبناي كلاس‌ها و متدها است و نه بر مبناي فايل‌هاي فيزيكي موجود در سيستم. اگر درخواستي به سيستم ارسال مي‌شود، در ابتدا، اين درخواست جهت پردازش، به يك متد عمومي موجود در يك كلاس كنترلر هدايت خواهد شد و نه به يك فايل فيزيكي ASPX (برخلاف وب فرم‌ها).


همانطور كه در تصوير مشاهده مي‌كنيد، در ابتداي پردازش يك درخواست، آدرسي به سيستم ارسال خواهد شد. بر مبناي اين آدرس، نام كنترلر كه در اينجا زير آن خط قرمز كشيده شده است، استخراج مي‌گردد (براي مثال در اينجا نام اين كنترلرProducts است). سپس فريم ورك به دنبال كلاس اين كنترلر خواهد گشت. اگر آن‌را در اسمبلي پروژه بيابد، از آن خواهد خواست تا درخواست رسيده را پردازش كند؛ در غيراينصورت پيغام 404 يا يافت نشد، به كاربر نمايش داده مي‌شود.
اما فريم ورك چگونه اين كلاس كنترلر درخواستي را پيدا مي‌كند؟
در زمان اجرا، اسمبلي اصلي پروژه به همراه تمام اسمبلي‌هايي كه به آن ارجاعي دارند جهت يافتن كلاسي با اين مشخصات اسكن خواهند شد:
1- اين كلاس بايد عمومي باشد.
2- اين كلاس نبايد abstract باشد (تا بتوان آن‌را به صورت خودكار وهله سازي كرد).
3- اين كلاس بايد اينترفيس استاندارد IController را پياده سازي كرده باشد.
4- و نام آن بايد مختوم به كلمه Controller باشد (همان مبحث Convention over configuration يا كار كردن با يك سري قرار داد از پيش تعيين شده).

براي مثال در اينجا فريم ورك به دنبال كلاسي به نام ProductsController خواهد گشت.
شايد تعدادي از برنامه نويس‌هاي ASP.NET MVC تصور ‌كنند كه فريم ورك در پوشه‌ي استانداردي به نام Controllers به دنبال اين كلاس خواهد گشت؛ اما در عمل زمانيكه برنامه كامپايل مي‌شود، پوشه‌اي در اين اسمبلي وجود نخواهد داشت و همه چيز از طريق Reflection مديريت خواهد شد.