原文地址:http://space.itpub.net/740297/viewspace-588913
3.在Global.asax中使用引導程式(Bootstrapper)如果您在global.asax的Application_Start方法中執行過多的任務(例如配置Ioc/DI、註冊路由、模型繫結器、視圖引擎、啟動應用相關的後台服務,等等)。例如在最新的Oxite源
代碼中有如下程式碼片段:protected virtual void OnStart() { setupContiner(); setupSite(); registerRoutes(); registerActionFilters(); registerModelBinders(); registerViewEngines(); registerControllerFactory(); launchBackgroundServices(); }你不認為它執行了過多的任務了嗎?有什麼方式能對其進行擴充?如何再往其中添加新的路由、模型繫結、視圖引擎而無需修改它?它沒有違背Open-closed原則嗎?引導程式(Bootstrapper)正是用來解決這些問題。建立Bootstrapper的過程如下:a.建立一個Task介面public interface IBootstrapperTask { void Execute(); }b.為每種類型的任務建立一個類,並實現前面定義的介面,如:public class RegisterControllerFactory : IBootstrapperTask { private readonly IControllerFactory _controllerFactory; public RegisterControllerFactory(IControllerFactory controllerFactory) { _controllerFactory = controllerFactory; } public void Execute() { ControllerBuilder.Current.SetControllerFactory(_controllerFactory); } }public class RegisterRoutes : IBootstrapperTask { private readonly RouteCollection _routes; public RegisterRoutes() : this(RouteTable.Routes) { } public RegisterRoutes(RouteCollection routes) { _routes = routes; } public void Execute() { _routes.Clear(); _routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); _routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }); } } c.建立一個靜態Bootstrapper類來執行這些任務:public static class Bootstrapper { static Bootstrapper() { ConfigureContainer(); } public static void Run() { var tasks = ServiceLocator.Current.GetAllInstances<IBootstrapperTask>(); foreach(var task in tasks) { task.Execute(); } } private static void ConfigureContainer() { IUnityContainer container = new UnityContainer(); UnityConfigurationSection configuration = (UnityConfigurationSection) ConfigurationManager.GetSection("unity"); configuration.Containers.Default.Configure(container); ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container)); } } d.修改Global.asaxprotected void Application_Start() { Bootstrapper.Run(); }e.修改
web.config,將任務像這樣串接在一起:<unity> <typeAliases> <typeAlias alias="IControllerFactory" type="System.Web.Mvc.IControllerFactory, System.Web.Mvc"/> <typeAlias alias="ControllerFactory" type="UnityCommonServiceLocatorMVC.CommonServiceLocatorControllerFactory, UnityCommonServiceLocatorMVC"/> <typeAlias alias="IBootstrapperTask" type="UnityCommonServiceLocatorMVC.IBootstrapperTask, UnityCommonServiceLocatorMVC"/> <typeAlias alias="RegisterRoutes" type="UnityCommonServiceLocatorMVC.RegisterRoutes, UnityCommonServiceLocatorMVC"/> <typeAlias alias="RegisterControllerFactory" type="UnityCommonServiceLocatorMVC.RegisterControllerFactory, UnityCommonServiceLocatorMVC"/> </typeAliases> <containers> <container> <types> <type name="registerRoutes" type="IBootstrapperTask" mapTo="RegisterRoutes"/> <type type="IControllerFactory" mapTo="ControllerFactory"/> <type name="registerControllerFactory" type="IBootstrapperTask" mapTo="RegisterControllerFactory"> <typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"> <constructor> <param name="controllerFactory" parameterType="IControllerFactory"> <dependency/> </param> </constructor> </typeConfig> </type> </types> </container> </containers> </unity>因此,通過使用引導程式(Bootstrapper)可以使應用程式是可擴充的,我們可以建立新的任務並在應用程式啟動方法中執行它而無需修改任何東西。
相關閱讀:
- ASP.NET MVC Unleashed (6) (geez, 2009-3-17)
- ASP.NET MVC 1.0 正式發布 (geez, 2009-3-18)
- ASP.NET MVC Unleashed (6) (續) (geez, 2009-3-21)
- ASP.NET MVC技術專題 (朱先忠, 2009-3-27)
- ASP.NET MVC筆記 之 Action 過濾器 (iDotNetSpace, 2009-4-09)
- Asp.Net Mvc: 淺析TempData機制 (iDotNetSpace, 2009-4-09)
- ASP.NET MVC futures: MVC控制項概述 (geez, 2009-4-09)
- ASP.NET MVC futures: 局部視圖 (geez, 2009-4-10)
- ASP.NET MVC最佳實務(1) (geez, 2009-4-10)
- ASP.NET MVC最佳實務(2) (geez, 2009-4-13)