.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的配置信息。