您的位置:知识库 » .NET技术

.NET 2.0的Provider模式

作者: 极地银狐.NET  来源: 博客园  发布时间: 2009-03-17 15:25  阅读: 10166 次  推荐: 0   原文链接   [收藏]  
摘要:本文全面地介绍了Prodive模式的概念以及应用,对于理解Provider模式的理解起到了很大的帮助
[1] Provider模式统览
[2] 细节,细节,还是细节
[3] 执行

 

第二部分:细节,细节,还是细节~

现在我们已经大概了解了一下基础了。好,再让我们把程序深入一些。首先我们构建一个API用于和商店以及商店中的货物(或是叫产品)互交。

看看这个货物(或是叫产品,下同)类:


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

Store类定义了核心方法给我们(客户端),从storeproducts体现。


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

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

VendingMachineStoreProviderStore Provider类的另一具体实现。


Initialize()是每一个具体类都要实现的一个有趣方法。这个方法存在于ProviderBase中,但由ProvidersHelper调用。以下方法重写ProviderBase中的Initialize并从配置文件的节点中读取所需要的信息:

 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>

 

 1 public override void Initialize(string name, NameValueCollection config)
 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的配置信息。


0
0

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻