چرخه حیات MVC (بخش چهارم)

دوشنبه 17 اسفند 1394

در این مقاله ضمن توضیح الگوی طراحی Factory به پیاده سازی یک CustomController توسط این الگو خواهیم پرداخت .در ضمن نمونه ضمیمه این مقاله شامل تمام پیاده سازی های سری مقاله های چرخه حیات در mvc می باشد .

چرخه حیات MVC (بخش چهارم)

همان طو که می دانید Factory یک الگوی طراحی نرم افزار است .این الگو پیچیدگی یک شی را برای کسی که از آن استفاده می کند پنهان می کند .با استفاده از این الگو می توانیم بدون اینکه کلاس دقیق یک شی را مشخص کنیم  آن را نمونه سازی کرده و از آن استفاده کنیم .استفاده کننده به صورت مستقیم از شی نمونه نمی سازد بلکه با یک اینترفیس و یا یک کلاس Abstract مرتبط است و مسئولیت ایجاد کلاس واقعی را به Factory Method میسپارد. Factory Method یک کلاس است که البته می تواند استاتیک هم باشد .

در این مقاله از سری مقاله های چرخه حیات در mvc قصد داریم نحوه ایجاد شدن یک کنترلر و استفاده از آن را آموزش دهیم .لینک مقاله های قبلی در زیر قرار داده شده است

چرخه حیات برنامه های mvc بخش اول

چرخه حیات برنامه های mvc بخش دوم

چرخه حیات برنامه های mvc بخش سوم

کنترلر ها به تنهایی کاری انجام نمی دهند ولی اینترفیس IController را پیاده سازی می کنند .در داخل این اینترفیس متد بسیار مهمی به نام Execute وجود دارد .این متد یک متد جنریک است به این معنی که شما را قادر می سازد تا کنترلر خود را به صورتی که با نیازهایتان منطبق باشد بسازید.mvc به تنهایی بسیار قدرتمند است که بسیاری مفاهیم را پوشش می دهد ولی در عین حال می توانید برای نیاز های خاصی که دارید پیاده سازی های پیش فرض را تغییر دهید .

ControllerFactory که توسط MVCHandler استفاده می شود  در زیر آورده شده است .به صورت پیش فرض ControllerFactory کنترلر های مناسبی جهت پذیرش درخواست های ورودی ایجاد می کنید .در کد زیر یک کنترلر که باید اینترفیس IController     را پیاده سازی کرده باشد نمایش داده شده است

using System;    
using System.Web.Mvc;    
using System.Web.Routing;    
    
namespace MVC_Life_Cycle.Controllers    
{    
    public class SampleController : IController    
    {    
        public void Execute(RequestContext requestContext)    
        {    
            throw new NotImplementedException();    
        }    
    }    
} 

کدی که دیدید یک کد خام بود حالا به آن کدهای زیر را اضافه می کنیم .

using System;    
using System.Net.Http;    
using System.Web;    
using System.Web.Mvc;    
using System.Web.Routing;    
    
namespace MVC_Life_Cycle.Controllers    
{    
    public class SampleController : IController    
    {    
        public void Execute(RequestContext requestContext)    
        {    
            //Displaying some message    
            HttpContext.Current.Response.Write("Hello From Custom Controller Implementation");    
        }    
    }    
} 

حال قصد داریم که یک controller factory ایجاد کنیم که کنترلر خاص ما را ایجاد کند .حال کد کلاس Factory که اینترفیس IControllerFactory     را پیاده سازی می کند در زیر آورده شده است .

    using System.Web.Mvc;    
    using System.Web.Routing;    
    using System.Web.SessionState;    
        
    namespace MVC_Life_Cycle.CustomFactory    
    {    
        public class CustomFactory :IControllerFactory    
        {    
            public IController CreateController(RequestContext requestContext, string controllerName)    
            {    
                throw new System.NotImplementedException();    
            }    
        
            public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)    
            {    
                throw new System.NotImplementedException();    
            }    
        
            public void ReleaseController(IController controller)    
            {    
                throw new System.NotImplementedException();    
            }    
        }    
    }   

همان طور که دیدید در این کلاس Factory سه متد مهم وجود دارد . CreateController و GetControllerSessionBehavior و ReleaseController .این متدها به ترتیب برای ایجاد کنترلر دومی برای مدیریت session و سومی برای پاک کردن کنترلر از حافظه استفاده می شود .

   
 

دوباره در زیر کدهای این کلاس را تغییر می دهیم

using System.Web.Mvc;    
using System.Web.Routing;    
using System.Web.SessionState;    
using MVC_Life_Cycle.Controllers;    
    
namespace MVC_Life_Cycle.CustomFactory    
{    
    public class CustomFactory :IControllerFactory    
    {    
        public IController CreateController(RequestContext requestContext, string controllerName)    
        {    
            //Finds the controller with its name and then bring the logic here    
            if (controllerName == "Sample")    
            {    
                return new SampleController();    
            }    
            else    
            {    
                //Else return the existing one    
                return new HomeController();    
            }    
        }    
    
        //These two implementations are not required for the time being. Hence, kept the default values    
        public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)    
        {    
           return SessionStateBehavior.Default;    
        }    
    
        public void ReleaseController(IController controller)    
        {    
            //Since, this is void method. Hence, left empty for the time being    
        }    
    }    
}

برای اینکه این کلاس را برنامه ما درک کند و بر طبق آن کنترلرهایی را ایجاد کند در داخل lobal.asax تغییرات زیر را اعمال می کنیم .

    using System.Diagnostics;    
    using System.Web;    
    using System.Web.Mvc;    
    using System.Web.Optimization;    
    using System.Web.Routing;    
    using MVC_Life_Cycle;    
    using MVC_Life_Cycle.CustomModules;    
        
    [assembly: PreApplicationStartMethod(typeof(MvcApplication), "RegisterCustomModule")]    
    namespace MVC_Life_Cycle    
    {    
        public class MvcApplication : System.Web.HttpApplication    
        {    
            public static void RegisterCustomModule()    
        
            {    
                HttpApplication.RegisterModule(typeof(CustomModule));    
            }    
            protected void Application_Start()    
            {    
                //Registering that custom controller    
                ControllerBuilder.Current.SetControllerFactory(new CustomFactory.CustomFactory());    
                AreaRegistration.RegisterAllAreas();    
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);    
                RouteConfig.RegisterRoutes(RouteTable.Routes);    
                BundleConfig.RegisterBundles(BundleTable.Bundles);    
            }    
        
            protected void Application_End()    
            {    
                Debug.WriteLine("Application Stopped");    
            }    
        }    
    }   

برای اجرای برنامه کافی است وارد کنترلر Sample شده و سپس ctrl+F5 را فشار دهید .

فایل های ضمیمه

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید