MVC 路由註冊、WF 執行緒啟動、Unity 容器初始化……所有框架初始化代碼堆疊在 Application_Start,任一變更皆需修改此方法,違反開放封閉原則。
定義 IHttpApplicationExtension 介面,各框架實作並註冊。HttpApplication 啟動時遍歷擴展集合呼叫初始化,新增框架零修改 Global.asax。
public interface IHttpApplicationExtension
{
void Initialize(HttpApplication app);
}
public class HttpApplicationExtender
{
private readonly List<IHttpApplicationExtension> extensions = new List<IHttpApplicationExtension>();
public void Add(IHttpApplicationExtension ext) { extensions.Add(ext); }
public void InitializeAll(HttpApplication app)
{
foreach(var ext in extensions) ext.Initialize(app);
}
}
Global.asax 僅需:
protected void Application_Start()
{
new HttpApplicationExtender()
.Add(new MvcRouteRegistrar())
.Add(new WorkflowRuntimeStarter())
.Add(new UnityContainerInitializer())
.InitializeAll(this);
}
新框架只需實作 IHttpApplicationExtension 並加入擴展清單,互不干擾,符合 OCP。