ASP.NET 2.0 組態檔中無處不在的 Provider(如 XmlSiteMapProvider、SqlMembershipProvider)共享同一父類別:ProviderBase。以 Membership 為例,深度剖析 Provider 模式如何結合策略模式、控制反轉 (IoC) 與依賴注入 (DI) 實現靈活可擴充的架構。


System.Web.Security.Membership 密封類別,靜態方法(CreateUser、DeleteUser 等),不提供具體實作經典策略模式透過建構子注入策略。此處 Membership 為靜態類別,Provider 與 ProviderCollection 為唯讀屬性,策略實為 Provider 自行透過應用程式上下文取得。
效果:將 Membership API 對具體 Provider 的依賴,轉化為:
MembershipProviderSqlMembershipProvider 依賴 MembershipProvider符合開放封閉原則 (OCP),確保系統靈活性與效率。
傳統分層自底向上設計,上層直接依賴下層組件 → 底層難修改。策略模式將 MembershipProvider 抽象類別提升至上層,底層具體實作反而依賴上層抽象,依賴方向反轉。
收益:即插即用——Provider 可插拔,Provider 造成的系統問題由自身負責,不波及上層。
自訂 Provider(如 OracleMembershipProvider)如何被 Membership API 使用?核心在執行期透過反射注入相依組件。
DI 三種形式:
通常由 IoC 容器(如 Spring.NET)完成。但在 Membership 中,單純反射工廠即足夠,無需複雜物件裝配。
<membership>
<providers>
<clear/>
<add name="OracleMembershipProvider" type="Oracle.OracleMembershipProvider" />
</providers>
</membership>
type 指定自訂 Provider 完整型別名稱(含命名空間)。僅需將組件置於 Bin 目錄、修改 Web.config,即完成 Provider 切換,零 C# 程式碼變更。
ASP.NET 2.0 Provider 模式是策略模式 + IoC + 反射式 DI 的經典綜合應用,展現框架級設計的優雅:高內聚、低耦合、可擴充、可配置,是建構可插拔系統的標竿架構。