معماري و مدل Provider در ASP.NET 2.0
همانطور كه پيشتر هم گفتيم، معماري ASP.NET 2.0 به گونهاي است كه ميتوانيد هم از كدهايي كه قبلاً نوشتهايد استفاده كنيد و هم از ويژگيها و قابليتهاي نسخه دوم اين فناوري بيبهره نمانيد. اين ويژگي كه در حقيقت مهمترين ويژگي ASP.NET 2.0 است، از طريق مدلي به نام Provider Model فراهم ميشود. بسياري از قابليتهاي ASP.NET 2.0 از طريق Providerها در اختيار برنامهنويس قرار ميگيرند.
Provider به زبان ساده يك كامپوننت يا شيء قابل اتصال (Pluggable) است كه ميتوان قابليتهاي آن را توسعه داد يا به كلي آن را با يك كد موجود تعويض كرد. منطق Provider ها در حقيقت از همان منطق شيء گرايي در برنامه نويسي الهام گرفته است. به بيان ديگر، ميتوانيد كاركرد و عملكرد آن قسمت از پلتفرم ASP.NET 2.0 را كه با مدل Provider نوشته شده است توسعه دهيد يا كالبد آن را به كلي با كد دلخواه خودتان عوض كنيد. آنچه براي موتور ASP.NET 2.0 مهم است اينترفيس و Syntax اين Providerها است و كاري با محتواي درون آنها ندارد.
بنابراين اگر از عملكرد قسمتي از ASP.NET 2.0 راضي نيستيد، ميتوانيد كد جديدي براي انجام وظايف آن بنويسيد. در اينصورت موتور ASP.NET 2.0 به طور خودكار كد شما را اجرا خواهد كرد. سيستم مديريت كاربران
(User Membership)، مديريت حالت (Session State Management)، معماري شخصيسازي (Personalization) و ماجول Site Navigation در نسخه دوم ASP.NET از جمله قسمتهايي هستند كه با مدل Provider نوشته شدهاند و شما ميتوانيد از قابليتهاي آنها استفاده كنيد يا كدي را كه قبلاً خودتان نوشتهايد، جايگزينشان كنيد.
مثلاً احتمال زيادي دارد كه تاكنون كلاسي براي انجام كارهاي امنيتي مانند Login و نگهداشتن اطلاعات كاربراني كه وارد سيستم شدهاند و نيز مديريت سطح دسترسي آنان نوشته باشيد. اگر بخواهيد پلتفرم كاري خود را به
ASP.NET 2.0 منتقل كنيد و مايل باشيد از API جديد اين نسخه براي كارهاي امنيتي استفاده كنيد، بايد سورس كد قبلي خود را كنار بگذاريد. اگر براي نوشتن اين كد زحمت زيادي كشيده باشيد، چنين كاري مطلوب شما نيست.
پلتفرم ASP.NET 2.0 اين امكان را در اختيار شما ميگذارد كه راهي براي استفاده از كد موجود خود پيدا كنيد.
در حقيقت معماري ASP.NET 2.0 با الهام از منطق شيء گرايي، طوري نوشته شده است كه شما بتوانيد ازSyntax متدها (توابع) و خواص (Properties) كلاسهاي نوشته شده در اين نسخه استفاده كنيد؛ بدون اينكه مجبور باشيد به كد داخل اين متدها و خواص محدود بمانيد. بنابراين Providerها پوستههايي هستند كه ميتوانيد دور كد موجود خود بكشيد. طوري كه موتور ASP.NET 2.0 بتواند زبان آن را بفهمد و با آن كار كند.
فايده اين كار چيست؟ مزيت اين مدل هنگامي آشكار ميشود كه شما بدانيد برخي قابليتها در ASP.NET 2.0 به يكديگر وابستهاند. به عنوان مثال، ماجول شخصيسازي به ماجول امنيتي وابستگي دارد. بنابراين اگر بخواهيد از اولي استفاده كنيد، بايد Syntax ماجول دوم طوري باشد كه ASP.NET 2.0 منطقش را درك كند. اگر كد موجود خود را بدون تغيير به درون يك برنامه ASP.NET 2.0 تزريق كنيد، ماجول Personalization منطق آن را درك نخواهد كرد؛ هرچند كه ميتوانيد همچون گذشته كارهاي مربوط به Login و سطح دسترسي كاربران را به كمك كد دستساز خود انجام دهيد.
علاوه بر اين، استفاده از مدل Provider اين حُسن را دارد كه در آينده نيز اگر قابليت جديدي به ASP.NET افزوده شود، شما همچنان ميتوانيد ميان كد موجود خود و API جديد پل ارتباطي برقرار كنيد. مايكروسافت براي آن دسته از برنامهنويسان كه مايل به استفاده از مدل Provider براي تزريق كد خود به ساختار ASP.NET 2.0 هستند، يكToolkit فراهم كرده است.
تصاوير 6 و 7 و 8 مثال بسيار سادهاي از منطق اين مدل را نشان ميدهد. در شكل 6 شما تصوير قسمتي از يك صفحه به نام login.aspx را در يكي از مثالهاي آموزشي ASP.NET 2.0 مشاهده ميكنيد كه Username وPassword كاربر را ميگيرد و عمليات احراز هويت و تصديق كاربر را انجام ميدهد. با اين وجود، اگر به كد پشت اين صفحه مراجعه كنيد، با كمال تعجب هيچ كدي براي Authentication در آنجا پيدا نخواهيد كرد.
پس اين كار چگونه صورت ميگيرد؟ اگر به سورس HTML صفحه مراجعه كنيد (شكل 7) متوجه ميشويد كه از دو سه كنترل جديد به نامهاي CreateUserWizard و CreateUserWizardStep و CompleteWizardStep استفاده شده است. اين كنترلها عمليات login را توسط API پيش فرض ASP.NET 2.0 براي اين منظور انجام ميدهند.
اگر ميخواهيد بدانيد كدام تابع دقيقاً اين كار را انجام ميدهد، بايد به كلاس Membership مراجعه كنيد. در آنجا تابعي به نام ValidateUser خواهيد يافت.
در شكل 8 تعريف اين تابع را ميبينيد. اين، همان جايي است كه ميتوانيد كد خود را از طريق مدل Providerجايگزين كد موجود كنيد. در حقيقت تابع Membership.Provider.ValidateUser از نوع MustOverride است و بايد پياده سازي خاصي روي آن صورت بگيرد تا قابل استفاده باشد. موتور ASP.NET 2.0 پيادهسازي خاص خود را از طريق Membership.ValidateUser در اختيار شما ميگذارد.