日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

体验.net2.0的优雅(4):Provider、策略、控制反转和依赖注入

發布時間:2025/7/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 体验.net2.0的优雅(4):Provider、策略、控制反转和依赖注入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ASP.net 2.0 的配置文件中,經常看到 Provider的影子,比如說StarterKit 中的XmlSiteMapProvider以及使用Login Controls時隱含的SqlMembershipProvider。如此眾多的Provider,我猜測它們肯定有共同的父親!查閱了一下資料,果然不出我所料,它們的父親是 ProviderBase

?

[圖中的 三個點 代表直接父類的名稱]

我們以Membership為例,來看一下這么多的Provider是怎么被系統所使用的,以及使用它們會給我們帶來什么樣的好處。

?

LoginControls(包括登錄、創建用戶、修改密碼等控件)是服務器控件,這些服務器控件通過MembershipAPI 來執行相應的操作。MembershipAPI是密封類(System.Web.Security.Membership類),其中定義了很多靜態的方法,包括 CreateUserDeleteUser等等,但是本身并不提供具體的實現,而是使用MembershipProvider提供的服務。MembershipProvider是一個抽象類,其中也定義了CreateUserDeleteUser 等方法,SqlMembershipProvider是它的一個實現,可以將Membership的數據持久化到Sql Server 2005中。?

1.??Strategy?

這里用到了一個非典型的策略模式(strategy)。在典型的策略模式中,Provider應該是通過構造方法注入,而在此處,Membership是一個靜態類,它的ProviderProviderCollection都是只讀屬性,因此我猜測Provider并非是由其他類注入的,而是由Provider自己通過應用上下文獲取到的。策略模式的作用是將 MembershipAPI 對具體的Provider(比如SqlMembershipProvider)的依賴轉化成了 對抽象類 MembershipProvider 的依賴 + SqlMembershipProviderMembershipProvider的依賴,從而符合開閉原則(OCP)。這樣可以保證系統的靈活性和效率。?

2.?? IoC?

這里應用的策略模式的一個附帶的好處是實現了 控制反轉(IoC)。通常我們設計分層應用的時候,都是自底層向上層設計,上層的組件使用下層提供的服務并直接依賴于下一層的組件。這樣做的缺點是 造成底層組件很難修改,因為任意的修改(比如修改方法的功能或者名稱)都可能導致上層應用崩潰。使用了策略模式模式以后,我們把MembershipAPIMembershipProvider抽象類置于同一層(上層)中,底層的SqlMembershipProvider則依賴于上一層(實現MembershipProvider中的抽象方法)。很明顯,我們將上層組件對下層組件的依賴轉化成了下層組件對于上層組件的依賴,這就是控制反轉。好處是給我們帶來了即插即用功能---Provider是可插接的,由于Provider造成的一切系統崩潰都由 Provider 自己負責。?

3.??Dependency Injection?

我們可以實現自己的MembershipProvider,比如說OracleMembershipProvider---使用Oracle來存儲MembershipProfile數據---只要我們繼承MembershipProvider類并覆寫的部分方法即可。那么我們編寫的 OracleMembershipProvider 或者 系統自帶的 SqlMembershipProvider是如何被 MembershipAPI 使用的呢?這里有一個重要的概念---依賴注入(Dependency Injection)。依賴注入的意思是將應用程序依賴的組件在運行時注入給應用,依賴注入一般要使用反射技術。

依賴注入通常分為3種形式:

構造注入:通過構造方法將組件注入
設值注入:通過設置屬性的值將組件注入
接口注入:從容器中獲取指定接口的實現

注入過程一般由某種 IoC 容器(比如Spring)完成,而且特別適合由容器完成。很難說在MembershipAPI 中使用了某種典型的依賴注入方式。我們可以這么說,僅僅使用了反射工廠。因為在這里,僅僅使用反射已經足夠,不需要復雜的對象裝配過程。

如果不考慮內部的實現過程,我們要做的,僅僅是將我們的實現拷貝到Bin目錄,并在Web.Config文件中system.web節中增加下面的節點:

<Membership>
??????
<providers>
????????
<clear/>
????????
<add?name="OracleMembershipProvider"?type="Oracle.OracleMembershipProvider"/>
??????
</providers>
</Membership>

其中 type 中定義的就是 我們自定義的Provider的全名稱(包括名字空間)。

轉載于:https://www.cnblogs.com/QuitGame/archive/2006/01/16/318502.html

總結

以上是生活随笔為你收集整理的体验.net2.0的优雅(4):Provider、策略、控制反转和依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。