概述
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 上面。