ASP.NET MVC最佳實務(3)

來源:互聯網
上載者:User

原文地址: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)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.