第一部分: Provider模式統(tǒng)覽
Provider設(shè)計模式是在.NET 1.1 framework中被首次介紹到,特別是在ASP.NET快速入門中,以及后來在ASP.NET Whidbey中作為membership management provider API被正式化。它的主要目的在于為一個API進行定義和實現(xiàn)的分離。這樣就通過核心功能的靈活性和易于修改的特點使得API具有靈活性。
在MSDN上能找到關(guān)于此模式在.NET 1.1 Framework的更多信息:
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/dnASPNET/html/ASP02182004.ASP
和
http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/dnASPNET/html/ASP02182004.ASP
Provider設(shè)計模式基本上是由GOF的兩個設(shè)計模式溶合而成的:strategy和abstract factory。API定義好,其功能通過strategy模式變異而來,是“可插(拔)”的,而功能被加載進內(nèi)存則是通過大致地一個abstractfactory設(shè)計模式而實現(xiàn)的。
以下是此部分基本概要,以及它們?nèi)绾位ソ弧?/span>
1. API Class:這是一個通過靜態(tài)方法定義和暴露所需功能的類,在API Class中并沒有具體的實現(xiàn)。此類保持一個對Application ProviderBase類的引用,這個base類會對API中的功能進行基本的包裝(Wrap)。
本文中的API Class是一個商店(Store)我們可以從中買東西,如Coke(可樂)、Snickers(譯者:不知道這是啥。),還有在吃Snicker和喝Coke時所要的diet pills(減肥藥)。
我們的類包括以下幾部分:
A:我們有基本的API用于存放貨物AddProductToStock,還有如GetProductPrice、GetProductStockCount以及RemoveProductFromStock等核心方法。
B:我們有個叫Initialize()的方法用于從系統(tǒng)配置文件中加載已有的具體商店。
C:我們有所有可用Provider的引用。
D:我們有一個默認(rèn)Provider的引用,此Provider已被包裝。
一旦實例化,所有對這個API類的請求都會一個一個地轉(zhuǎn)給默認(rèn)的Provider。
2. Provider Base Class:這是一個內(nèi)部抽象類,位于System.Configuration.Provider命名空間,用于定義一個Provider。Initialize()方法用于從配置文件中獲取必要的信息來構(gòu)建具體的Provider。我們在自己實現(xiàn)這個抽象類的時候要記的重寫Initialize()方法。
3. Application ProviderBase:這是一個從ProviderBase類繼承來的一個抽象類,同時也是API類的一個“鏡像”,通過在API中所暴露的方法來為父類定義抽象方法并在父類中實現(xiàn)。
在我們的應(yīng)用程序中我們把這個類叫做“StoreProvider”,請注意這個Store Provider是如何定義在Store類中已有的方法,同時從ProviderBase類繼承。
4. Concrete Provider:Application Provider Base中所定義的方法在這個類中實現(xiàn)。Concrete Provider為了從配置文件中讀取信息而會重寫Initialize()方法
這四個類是實現(xiàn)Provider模式所必須的。其它的類則是用來定義一個Provider能提供什么東西(在本文中,是一個Product類)或是在以后為這些對象提供服務(wù)的工具類,或是用于管理程序配置文件。
這些東西看起來有點暈,不過當(dāng)你看到一個請求傳給Store類后再轉(zhuǎn)交給一個StoreProvider的引用,由具體的CornerStoreProvider去完成時,你就知道這幾個“齒輪”是如何配合的了。
第二部分:細(xì)節(jié),細(xì)節(jié),還是細(xì)節(jié)~
現(xiàn)在我們已經(jīng)大概了解了一下基礎(chǔ)了。好,再讓我們把程序深入一些。首先我們構(gòu)建一個API用于和商店以及商店中的貨物(或是叫產(chǎn)品)互交。
看看這個貨物(或是叫產(chǎn)品,下同)類:
這個類并不是Provider模式的一部分,我們只是用它來把數(shù)據(jù)搬進搬出而已。我們?yōu)槊總€貨物定義名字和批發(fā)價。每個商店自己的貨物都有自己不同的售價,所以我們還要計算這些貨物的零售價。我也添加了一個靜態(tài)方法來得到所有可用的貨物:GetProducts()和 Initialize()
Store類定義了核心方法給我們(客戶端),從store和products體現(xiàn)。
StoreProvider暴露了我們早先提到的抽象類中的方法
CornerStoreProvider是我們Store Provider類的具體實現(xiàn)。
VendingMachineStoreProvider是Store Provider類的另一具體實現(xiàn)。
Initialize()是每一個具體類都要實現(xiàn)的一個有趣方法。這個方法存在于ProviderBase中,但由ProvidersHelper調(diào)用。以下方法重寫ProviderBase中的Initialize并從配置文件的節(jié)點中讀取所需要的信息:
1 xml version="1.0" encoding="utf-8" ?>2
3 <configuration>
4
5 <configSections>
6
7 <section name="store" type="ProviderSample.StoreProviderConfigurationSection,
8
9 ProviderSample, Version=1.0.0.0,
10
11 Culture=neutral,PublicKeyToken=null" />
12
13 configSections>
14
15 <store defaultProvider="CornerStoreProvider">
16
17 <providers>
18
19 <add name="VendingMachineStoreProvider"
20
21 type="VendingMachineStoreProvider"
22
23 Coke="0.75"
24
25 Snickers="0.5"
26
27 Diet_Pills="1.25"
28
29 >add>
30
31 <add name="CornerStoreProvider"
32
33 type="CornerStoreProvider"
34
35 Coke="0.70"
36
37 Snickers="0.65"
38
39 Diet_Pills=".80"
40
41 >add>
42
43 providers>
44
45 store>
46
47 configuration>
第三部分:執(zhí)行
為了使用我們的API,我們要對靜態(tài)的Store類進行方法調(diào)用,在本次示例中如果我們默認(rèn)的provider存有產(chǎn)品,我們可以通過API類(Store)提供的方法使用默認(rèn)provider。
1 // Get some coke
2
3 Product p1 = Product.GetProduct("Coke");
4
5
6
7 // find out the cost
8
9 double cost = Store.GetProductPrice(p1);
10
11
12
13 // get it from the store
14
15 Store.RemoveProductFromStock(p1); // remove from inventory
NET技術(shù):.NET 2.0的Provider模式,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。