.NET 2.0的Provider模式
第二部分:细节,细节,还是细节~
现在我们已经大概了解了一下基础了。好,再让我们把程序深入一些。首先我们构建一个API用于和商店以及商店中的货物(或是叫产品)互交。
看看这个货物(或是叫产品,下同)类:

这个类并不是Provider模式的一部分,我们只是用它来把数据搬进搬出而已。我们为每个货物定义名字和批发价。每个商店自己的货物都有自己不同的售价,所以我们还要计算这些货物的零售价。我也添加了一个静态方法来得到所有可用的货物:GetProducts()和 Initialize()
Store类定义了核心方法给我们(客户端),从store和products体现。

Store Provider暴露了我们早先提到的抽象类中的方法

CornerStoreProvider是我们Store Provider类的具体实现。

VendingMachineStoreProvider是Store Provider类的另一具体实现。

Initialize()是每一个具体类都要实现的一个有趣方法。这个方法存在于ProviderBase中,但由ProvidersHelper调用。以下方法重写ProviderBase中的Initialize并从配置文件的节点中读取所需要的信息:
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>
 2 
 3 {
 4 
 5     if (string.IsNullOrEmpty(name))
 6 
 7         name = "CornerStoreProvider";
 8 
 9  
10 
11     if (null == config)
12 
13         throw new ArgumentException("config parameter can not be null");
14 
15  
16 
17     if (string.IsNullOrEmpty(config["description"]))
18 
19     {
20 
21         config.Remove("description");
22 
23         config.Add("description", "A Corner store from which to get a product");
24 
25     }
26 
27  
28 
29     base.Initialize(name, config);
30 
31  
32 
33     m_inventory.Clear();
34 
35  
36 
37     foreach (Product p in Product.GetProducts())
38 
39     {
40 
41         if (string.IsNullOrEmpty(config[p.Name]))
42 
43         {
44 
45             m_markup.Add(p, 0);
46 
47         }
48 
49         else
50 
51         {
52 
53             m_markup.Add(p, Convert.ToDouble(config[p.Name]));
54 
55         }
56 
57     }
58 }
在System.Web.Configuration命名空间中有一个ProvidersHelper类,由于本示例是一个windows程序,所以我用反射重写了这个工具类,这样就不用引入整个 System.Web.Configuration命名空间了。ProvidersHelper是用于实例化具体Provider类以及从配置文件中读取所需要的信息,如果你想在WEB应用中实现Provider模式,使用System.Web.Configuration.ProvidersHelper来代替。(接口是相同的,所以很容易换过去。)

同样,有一个StoreProviderConfigurationSection继承自
System.Configuration.ConfigurationSection
用来从配置文件中获取Providers 和 default provider的配置信息。

 
                