概述
HttpApplication對象對於做ASP.NET開發的朋友,我想沒有人不熟悉它。在ASP.NET開發中,經常避免 不了要在HttpApplication中執行一些操作,如使用了ASP.NET MVC框架,就會在Application_Start 事件 中避免不了這樣的路由規則配置代碼:
protected void Application_Start()
{
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
如果僅僅是這一條,看起來倒不覺的有什麼問題,但如果同時在應用程序中使用了工作流,又避免不 了在Application_Start出現啟動工作流運行時的代碼:
protected void Application_Start()
{
// 注冊路由規則
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
// 啟動工作流
WorkflowRuntime workflowRuntime = new WorkflowRuntime ("workflowServicesConfig");
ExternalDataExchangeService externalDataExchangeService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalDataExchangeService);
workflowRuntime.StartRuntime();
}
試想一下,現在我們僅僅是有了ASP.NET MVC路由規則的配置、WF運行時的啟動,如果在應用程序中使 用某種DI框架,如微軟的Unity,是不是又避免不了要出現這樣的容器初始化代碼呢?
protected void Application_Start()
{
// 注冊路由規則
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
// 啟動工作流
WorkflowRuntime workflowRuntime = new WorkflowRuntime ("workflowServicesConfig");
ExternalDataExchangeService externalDataExchangeService = new ExternalDataExchangeService();
workflowRuntime.AddService(externalDataExchangeService);
workflowRuntime.StartRuntime();
// 初始化DI容器
IContainerContext repositoryContainer = ContainerManager.GetContainer ("repositoryContainer");
repositoryContainer.Initialize();
}
再看看Application_Start事件中的代碼,有ASP.NET MVC的工作,有WF的工作,也有Unity的工作,不 知道將來還會有什麼?這些原本互相之間沒有任何聯系的代碼,現在卻同時堆在了一起,當每一部分(或 者說每一個框架)變化的時候,都會涉及到Application_Start中代碼的修改,顯然違反了OCP原則。那麼 有沒有一種機制,讓這些互不相干的模塊之間互相獨立,各自發生變化時不影響對HttpApplication?此 時我們就需要對HttpApplication進行擴展,提供一個擴展點,讓其他模塊的程序附加到HttpApplication 上面。