国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

深入ASP.NET 2.0的提供者模型

2024-07-10 13:09:47
字體:
來源:轉載
供稿:網友

  一、 引言

  早在2001年,我就著手開發一個asp.net在線消息板應用程序webforums.net。其目的是創建一個基于asp.net的消息板系統,而且該系統可以容易插入到一個現有網站中。構建這樣一個端對端應用程序的特別挑戰之一就是,要為客戶提供一種方式以便能夠把它集成到他們自己的系統中去。例如,一個在線論壇明顯需要使用某種數據存儲來存儲用戶信息、論壇、回寄信息等;但是,最好不要把客戶鎖定到一種特定的數據存儲中。也就是說,你不應該說,"我的應用程序必須使用微軟的sql server 2000";因為這樣的話,使用oracle或access的客戶怎么會使用你的軟件呢?

  另一個集成到客戶現有數據中的問題是,所有的在線論壇站點都提供用戶帳戶和一種創建新帳戶的方式。典型情況下,這被建模為一個論壇架構(以一個數據庫中的users表形式存在)。但是,客戶很可能已經有他們自己的擁有成千的用戶帳戶的數據庫表?;蛘撸粋€客戶可能想在一個內部網設置中使用該論壇,并且想使用活動目錄而不是某種數據庫表來認證和存儲用戶信息。因此,當一個論壇軟件系統創建一個users數據庫表并對其客戶說"這就是你存儲用戶的方式"時,那些已經擁有現有基礎結構和用戶數據的客戶很可能會疏遠這樣的軟件。

  因此,當你使用一種"僵硬"的api構建一個系統時,會產生特別的挑戰。一種"僵硬"的api不是提供一種方式來定制邏輯而是硬編碼實現細節(例如,你必須使用sql server作為你的后端數據存儲,且在這個數據庫有一個users表,并將在其中存儲所有的用戶信息)。然而,通過使用提供者設計模式,你可以輕易地打破這種"僵硬"性。借助于提供者設計模式,系統架構師只需要定義api,至于編程功能則由系統來提供。對于一個在線論壇應用程序來說,這可能包括一個具有例如authenticate(username,password)和getuserdetails(username)等方法的users類。

  提供者模型的優秀在于客戶實現方案可以指定一個系統應該使用的定制類。這種定制類必須實現系統的良好定義的api;但是,它允許無縫地插入任何定制實現。也就是說,一旦定義這個api,系統實現者可以創建一個使用sql server和一個users表的默認的具體實現-大多數客戶可以直接使用之而不必要作任何修改。那些有定制需要的客戶(他們想使用oracle或以另外一些方式存儲用戶數據)可以創建他們自己的類,該類提供必要的功能并且把它們插入到這些客戶的系統中。

  其實,提供者設計模式被應用于整個asp.net 2.0實現中。當然,網上也存在一些如何在asp.net 1.x應用程序中使用這一功能的教程。

  在本文中,我們將詳細探討提供者模型并分析如何把它應用于asp.net 2.0開發中。

  二、 打破"僵硬"的api實現

  在我早期的webforums.net開發中,我認識到,這種"僵硬"的api實現將會成為一個問題。我的軟件設計目標之一就是:盡可能靈活且可定制,并且使用戶使用sql server,而且我的用戶數據模型實現應該看起來充其量只是有些限制性。為了克服這些問題,我構建了一個包含下面兩部分的系統:

  1. 一組定義了系統的核心功能的抽象基類;

  2. 能夠在運行時刻動態地加載一個擴展抽象基類。具體地說,該代碼負責檢查包含一個<configsetting>節(該節中給出要使用的類的完全限定名)的web.config文件。

  借助于這一架構,我可以通過一系列抽象基類來定義系統的功能,并使用sql server 2000和users表來提供這些類的具體實現。滿足這一配置的客戶可以只管使用該應用程序,并且一切將工作良好,且不需要他們編寫一行代碼。然而,那些需要定制的開發者們可以通過創建他們自己的派生自適當的抽象基類的類來實現。通過簡單地把該程序集放到應用程序的/bin目錄并更新web.config文件,他們可以讓系統使用這個新類。具體地說,webforums.net發行中帶有一個抽象基類dataprovider,它清楚地列舉出了系統中的所有方法,類似如下:

public abstract class dataprovider
{
public abstract bool authenticateuser(string username,string password);
public abstract user getuserinfo(string username);
...
public static dataprovider instance()
{
...
}
}

  authenticateuser(username,password)和getuserinfo(username)方法是系統定義的許多方法中的兩個方法的代表。而靜態instance()方法是該dataprovider類的主要實現;它包含檢查代表了webforums.net配置信息(該信息指示系統要使用的類的全稱限定名)的web.config文件的代碼。然后,該方法使用反射(和緩沖)來創建該類的一個實例并且把它返回到系統。

  webforums.net發行中還帶有一個派生自dataprovider基類的sqldataprovider類,這個類提供分類方法的具體實現。例如,sqldataprovider的所有方法都可以操作存儲于一個sql server 2000數據庫中的數據;與用戶相關的方法可以與一個預定義的users數據庫表一起工作。一個想改變后端功能的客戶可以創建他自己的派生自dataprovider的類,這些信息都可以展示于web.config文件中(指明應該使用他們的定制類)。例如,webforums.net中的web.config可能包括下列內容:

<webforumssettings>
<add key="dataproviderassemblypath" value="path" />
<add key="dataproviderclassname" value="namespace.classname" />
</webforumssettings>

  默認情況下,這個設置信息引用隨同webforums.net一起發行的sqldataprovider類。然而,如果一個客戶創建他自己的api實現,那么他可以提供自己的類的細節,并且系統會自動地開始使用他的實現來創建默認實現。

  借助于這一架構,使用webforums.net的頁面開發者可以使用如下所示的代碼來認證一個用戶:

if (dataprovider.instance().authenticateuser(username,password))
//用戶被認證
else
//用戶名/口令無效!

  當調用dataprovider.instance()方法時,上面的配置文件被檢查并且返回適當類的一個實例。如果客戶還沒有創建他們自己的實現的話,這將是默認的sqldataprovider類;而如果他們已經實現的話,它將是他們自己的類。一旦dataprovider.instance()方法返回一個適當的提供者實例,我們就可以簡單地調用該api的成員(在這個例子中是authenticateuser())。

  webforums.net提供者模型-一個早期的原型

  相對于微軟建議使用的提供者模型,andy的提供者模型含有一些不足。一方面,webforums.net中提供了單個抽象基類,所有的api定義都聚集在這個類中。其負面作用在于,如果一個客戶僅想定制系統的一小部分,例如用戶信息的存儲方式,那么他必須提供該系統中所有方法的實現。一種更好的方案是,為系統中的每一個邏輯實體創建一個抽象基類。例如,對于一個在線消息板應用程序來說,它可能需要一些類,如usersprovider,forumsprovider,postsprovider,等等。然而,在你提供給一個客戶的提供者數目之間也存在一個平衡問題。更多提供者允許更為細致的系統定制,但是也會相應地提高要求的配置標記的數量。

  另外,我已經展示了對webforums.net的提供者模型實現代碼的作了進一步改進,以便使其更相似于微軟在asp.net 2.0中所使用的代碼。我認為,andy的想法應該是提供者模型的先驅,盡管微軟的提供者模型實現更為清晰且更強壯一些。

  一方面,webforums.net在2002年三月為微軟所收購;另一方面,rob howard及其他人又在系統中加入了大量的新特征并且在asp.net論壇中以自由方式發行它。today rob及其小組成員已經把asp.net論壇變成了一個community server(它簡直把博客、論壇、畫廊、列表服務器、新聞閱讀器等全部融為一體)。今天,andy所創建的概念與實現被廣泛應用于asp.net論壇和community server中,甚至被應用于許多核心asp.net 2.0組件中。

  三、 提供者模型優點

  提供者模型提供許多優點。首先,在代碼和后端實現之間存在清晰的分離。不管認證一個用戶的代碼是針對一個sql server 2000數據庫的users表還是針對于一個活動目錄存儲,從頁面開發者的觀察看來代碼都是相同的:

dataprovider.instance().authenticateuser(username,password);

  而且,后端實現變化是透明的。

  因為系統架構師被鼓勵創建默認的實現,所以提供者模型提供了兩種世界的最好結合:如果對默認實現已經比較滿意,那么系統會按預期進行工作;對于需要定制系統的用戶來說,他們盡管定制好了而不必干擾現有代碼或編程邏輯。這個設計模式也使得原型化和靈敏開發容易許多。例如,在早期系統使用階段,僅使用默認實現可能更容易。然而,以后你可能需要定制某些方面以便把該工作與你的公司的現有系統集成到一起。這時,你可以通過提供者模型實現需要的定制。這意味著,不需要改變你的早期工作來反映后端實現的變化。

  就象許多好的設計模型一樣,提供者模型也提供了開發者之間的職責分離。這樣以來,一部分開發者可以使用他們精通的系統api進行工作,而另一部分開發者可以專注于后端實現和定制任務開發;而且,這兩組人員可以工作在同一個系統上而不會相互干擾。而且,如果他們所使用的系統是一種工業標準(例如asp.net 2.0),那么這兩類任務中的技能都可以被容易地移植到未來的工作中。

  四、 asp.net 2.0提供者模型

  asp.net 2.0在全部其架構中都利用提供者模型。例如,它的許多子系統-會員,站點導航,個性化等都利用了提供者模型技術。而且,每個子系統都提供一種默認實現,但也能使客戶定制其功能以滿足他們自己的需要。例如,asp.net 2.0的站點導航部分允許一個頁面開發者定義他們網站的可導航的結構。然后,這些數據就可以被各種web控件所使用以便顯示站點地圖、樹狀視圖或菜單-它們能夠高亮站點的導航并且/或者顯示用戶的站點位置。除了與導航相關的web控件外,站點導航api還提供了一組方法用于實現與網站導航信息的交互。

  默認地,站點的可導航信息必須以一個正確格式化的xml文件編碼。這種數據存儲方式是,默認站點導航被硬編碼使用。然而,asp.net 2.0的提供者模型可以使你更容易地使用你自己的數據存儲來實現站點導航。例如,在一個我當前開發的工程中,使用的一個數據庫包含站點中的頁面信息以及不同的用戶擁有頁面中什么樣的許可權。不是在一個xml文件中重新定義這些信息并且必須努力保持兩份信息的及時更新;而是,通過利用asp.net 2.0中的站點導航功能,我可以簡單地創建一個提供者類,它能夠直接與數據庫信息工作。一旦創建這個類并且在網站的配置中指定,導航web控件就可以根據存儲在數據庫中的應用程序的定制導航信息進行工作。(注意:在本文成文之時,這個工程使用的仍然是asp.net 1.x;然而,這個例子卻有希望能夠向你展示提供者模型的優點。)

  作為個人,我想,提供者模型只是asp.net 2.0提供的最優秀的遷移特征之一。asp.net 2.0提供了很多開發者在1.x版本中必須定制的新特征。如果這些2.0版本的新特征使用過于"僵硬"的實現方式,那么它將阻止基于定制方案的正在使用中的1.x應用程序向它的遷移,因為許多新的asp.net 2.0 web控件都使用了這些新的子系統。然而,有了提供者模型后,我們就可以把我們的1.x應用程序升級到2.0版本并且創建一個提供者以便使2.0版本的新的子系統與我們的定制方案集成到一起。這意味著,當遷移到2.0版本時,我們可以使用新的web控件并且使它們通過提供者模型而自然地使用我們的現有系統。

  五、 補充信息

  隨著提供者模型成為asp.net 2.0中的一個重要組成部分,微軟出版了很多關于這個主題的文章。如果你想了解更多這方面的信息,那么我鼓勵你閱讀一下rob howard的兩篇文章:

  · 《提供者模型設計模式與規范》;

  · 《asp.net 1.x提供者模型》。
 
  其中,第二篇文章分析了如何把提供者模型應用于你的asp.net 1.x應用程序。還有兩篇文章討論了asp.net 2.0的站點導航子系統中的提供者用法:

  · 《理解和擴展asp.net 2.0中的站點導航系統》,作者david gristwood;

  · 《定制asp.net 2.0中的提供者》,作者morgan skinner。

  注意,微軟還發行了另外一個提供者開發工具包,它也用于創建asp.net 2.0提供者。而且,還有一篇不錯的文章《asp.net 2.0提供者模型》可供你參考。

  六、 結論

  當創建具有各種要求的大量客戶所使用的系統時,一種"僵硬"的api實現可能會"嚇壞"了開發者;這種"僵硬"的實現往往會強迫客戶同意且被鎖定于系統架構師的"視野"之內。而一般地,公司往往更對能夠與他們的現有方案協同工作的應用程序和框架感興趣而不是強迫他們的方案服從供應商提供的系統。

  提供者模型提供了一種打破這種"僵硬"的實現問題的方法。借助于提供者模型,系統就能夠靈活地使用擴展特定基類的任何類。這樣以來,客戶可以創建他們自己的包括他們的定制邏輯和業務規則的派生類。而且,這些新類可以無縫地插接到系統中,而不必干擾應用程序中的現有代碼或任何自創建以來的新的定制代碼。

  總之,提供者模型在asp.net 2.0中得到普通使用;而且這些概念也可以應用于asp.net 1.x應用程序中。

  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 拉孜县| 澄迈县| 武鸣县| 台湾省| 泰安市| 建德市| 上饶县| 芒康县| 连平县| 波密县| 敦煌市| 遂溪县| 正镶白旗| 建昌县| 沅江市| 且末县| 楚雄市| 家居| 隆回县| 岫岩| 曲麻莱县| 泰和县| 紫阳县| 恩施市| 开江县| 泊头市| 应城市| 双流县| 凯里市| 马龙县| 监利县| 安多县| 南通市| 岑巩县| 南通市| 河池市| 青河县| 南岸区| 夏河县| 晋宁县| 雷波县|