设计模式 - Provider Pattern(提供者模式)
作者:
webabcd 介绍 为一个API进行定义和实现的分离。 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。根据配置文件中的配置来决定数据持久化方案是使用SqlServer数据库还是Xml文件。
 MessageModel
 using
?System; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?Message实体类  ????///?</summary>  ????public?class?MessageModel 
 ???? { 
 ????????/**////?<summary>  ????????///?构造函数  ????????///?</summary>  ????????///?<param?name="msg">Message内容</param>  ????????///?<param?name="pt">Message发布时间</param>  ????????public?MessageModel(string?msg,?DateTime?pt) 
 ???????? {  ????????????this._message?=?msg;  ????????????this._publishTime?=?pt;  ????????} 
 ????????private?string?_message; 
 ????????/**////?<summary>  ????????///?Message内容  ????????///?</summary>  ????????public?string?Message 
 ???????? { 
 ????????????get? {?return?_message;?} 
 ????????????set? {?_message?=?value;?}  ????????} 
 ????????private?DateTime?_publishTime; 
 ????????/**////?<summary>  ????????///?Message发布时间  ????????///?</summary>  ????????public?DateTime?PublishTime 
 ???????? { 
 ????????????get? {?return?_publishTime;?} 
 ????????????set? {?_publishTime?=?value;?}  ????????}  ????}  }

MessageProvider
 using
?System.Configuration.Provider; 
using
?System.Collections.Generic; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?操作Message抽象类  ????///?</summary>  ????public?abstract?class?MessageProvider?:?ProviderBase 
 ???? { 
 ????????/**////?<summary>  ????????///?插入Message  ????????///?</summary>  ????????///?<param?name="mm">Message实体对象</param>  ????????///?<returns></returns>  ????????public?abstract?bool?Insert(MessageModel?mm); 

 ????????/**////?<summary>  ????????///?获得Message  ????????///?</summary>  ????????///?<returns></returns>  ????????public?abstract?List<MessageModel>?Get();  ????}  }

SqlMessageProvider
 using
?System; 
using
?System.Collections.Specialized; 
using
?System.Collections.Generic; 

using
?System.Configuration.Provider; 
using
?System.Configuration; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?Sql方式操作Message  ????///?</summary>  ????public?class?SqlMessageProvider?:?MessageProvider 
 ???? {  ????????private?string?_connectionString; 

 ????????/**////?<summary>  ????????///?插入Message  ????????///?</summary>  ????????///?<param?name="mm">Message实体对象</param>  ????????///?<returns></returns>  ????????public?override?bool?Insert(MessageModel?mm) 
 ???????? {  ????????????//?代码略  ????????????return?true;  ????????} 

 ????????/**////?<summary>  ????????///?获取Message  ????????///?</summary>  ????????///?<returns></returns>  ????????public?override?List<MessageModel>?Get() 
 ???????? {  ????????????List<MessageModel>?l?=?new?List<MessageModel>();  ????????????l.Add(new?MessageModel("SQL方式,连接字符串是"?+?this._connectionString,?DateTime.Now)); 
 ????????????return?l;  ????????} 

 ????????/**////?<summary>  ????????///?初始化提供程序。  ????????///?</summary>  ????????///?<param?name="name">该提供程序的友好名称。</param>  ????????///?<param?name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。</param>  ????????public?override?void?Initialize(string?name,?NameValueCollection?config) 
 ???????? {  ????????????if?(string.IsNullOrEmpty(name))  ????????????????name?=?"MessageProvider"; 
 ????????????if?(null?==?config)  ????????????????throw?new?ArgumentException("config参数不能为null"); 
 ????????????if?(string.IsNullOrEmpty(config["description"])) 
 ???????????? {  ????????????????config.Remove("description");  ????????????????config.Add("description",?"SqlServer操作Message");  ????????????} 
 ????????????base.Initialize(name,?config); 
 ????????????string?temp?=?config["connectionStringName"];  ????????????if?(temp?==?null?||?temp.Length?<?1)  ????????????????throw?new?ProviderException("connectionStringName属性缺少或为空"); 
 ????????????_connectionString?=?ConfigurationManager.ConnectionStrings[temp].ConnectionString;  ????????????if?(_connectionString?==?null?||?_connectionString.Length?<?1) 
 ???????????? {  ????????????????throw?new?ProviderException("没找到'"?+?temp?+?"'所指的连接字符串,或所指连接字符串为空");  ????????????} 
 ????????????config.Remove("connectionStringName");  ????????}  ????}  }

XmlMessageProvider
 using
?System; 
using
?System.Collections.Specialized; 
using
?System.Collections.Generic; 

using
?System.Configuration.Provider; 
using
?System.Configuration; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?Xmll方式操作Message  ????///?</summary>  ????public?class?XmlMessageProvider?:?MessageProvider 
 ???? {  ????????private?string?_connectionString; 

 ????????/**////?<summary>  ????????///?插入Message  ????????///?</summary>  ????????///?<param?name="mm">Message实体对象</param>  ????????///?<returns></returns>  ????????public?override?bool?Insert(MessageModel?mm) 
 ???????? {  ????????????//?代码略  ????????????return?true;  ????????} 

 ????????/**////?<summary>  ????????///?获取Message  ????????///?</summary>  ????????///?<returns></returns>  ????????public?override?List<MessageModel>?Get() 
 ???????? {  ????????????List<MessageModel>?l?=?new?List<MessageModel>();  ????????????l.Add(new?MessageModel("XML方式,连接字符串是"?+?this._connectionString,?DateTime.Now)); 
 ????????????return?l;  ????????} 

 ????????/**////?<summary>  ????????///?初始化提供程序。  ????????///?</summary>  ????????///?<param?name="name">该提供程序的友好名称。</param>  ????????///?<param?name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。</param>  ????????public?override?void?Initialize(string?name,?NameValueCollection?config) 
 ???????? {  ????????????if?(string.IsNullOrEmpty(name))  ????????????????name?=?"MessageProvider"; 
 ????????????if?(null?==?config)  ????????????????throw?new?ArgumentException("config参数不能为null"); 
 ????????????if?(string.IsNullOrEmpty(config["description"])) 
 ???????????? {  ????????????????config.Remove("description");  ????????????????config.Add("description",?"XML操作Message");  ????????????} 
 ????????????base.Initialize(name,?config); 
 ????????????string?temp?=?config["connectionStringName"];  ????????????if?(temp?==?null?||?temp.Length?<?1)  ????????????????throw?new?ProviderException("connectionStringName属性缺少或为空"); 
 ????????????_connectionString?=?ConfigurationManager.ConnectionStrings[temp].ConnectionString;  ????????????if?(_connectionString?==?null?||?_connectionString.Length?<?1) 
 ???????????? {  ????????????????throw?new?ProviderException("没找到'"?+?temp?+?"'所指的连接字符串,或所指连接字符串为空");  ????????????} 
 ????????????config.Remove("connectionStringName");  ????????}  ????}  }

MessageProviderCollection
 using
?System.Configuration.Provider; 
using
?System; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?Message的Provider集合类  ????///?</summary>  ????public?class?MessageProviderCollection?:?ProviderCollection 
 ???? { 
 ????????/**////?<summary>  ????????///?向集合中添加提供程序。  ????????///?</summary>  ????????///?<param?name="provider">要添加的提供程序。</param>  ????????public?override?void?Add(ProviderBase?provider) 
 ???????? {  ????????????if?(provider?==?null)  ????????????????throw?new?ArgumentNullException("provider参数不能为null"); 
 ????????????if?(!(provider?is?MessageProvider))  ????????????????throw?new?ArgumentException("provider参数类型必须是MessageProvider."); 
 ????????????base.Add(provider);  ????????}  ????}  }

MessageProviderConfigurationSection
 using
?System.Configuration; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?Message的Provider的配置  ????///?</summary>  ????public?class?MessageProviderConfigurationSection?:?ConfigurationSection 
 ???? {  ????????private?readonly?ConfigurationProperty?_defaultProvider;  ????????private?readonly?ConfigurationProperty?_providers;  ????????private?ConfigurationPropertyCollection?_properties;  ???????? 
 ????????/**////?<summary>  ????????///?构造函数  ????????///?</summary>  ????????public?MessageProviderConfigurationSection() 
 ???????? {  ????????????_defaultProvider?=?new?ConfigurationProperty("defaultProvider",?typeof(string),?null);  ????????????_providers?=?new?ConfigurationProperty("providers",?typeof(ProviderSettingsCollection),?null);  ????????????_properties?=?new?ConfigurationPropertyCollection(); 
 ????????????_properties.Add(_providers);  ????????????_properties.Add(_defaultProvider);  ????????} 

 ????????/**////?<summary>  ????????///?Message的默认的Provider  ????????///?</summary>  ????????[ConfigurationProperty("defaultProvider")]  ????????public?string?DefaultProvider 
 ???????? { 
 ????????????get? {?return?(string)base[_defaultProvider];?} 
 ????????????set? {?base[_defaultProvider]?=?value;?}  ????????} 

 ????????/**////?<summary>  ????????///?Message的所有的Provider集合  ????????///?</summary>  ????????[ConfigurationProperty("providers",?DefaultValue?=?"SqlMessageProvider")]  ????????[StringValidator(MinLength?=?1)]  ????????public?ProviderSettingsCollection?Providers 
 ???????? { 
 ????????????get? {?return?(ProviderSettingsCollection)base[_providers];?}  ????????} 

 ????????/**////?<summary>  ????????///?Message的Provider的属性集合  ????????///?</summary>  ????????protected?override?ConfigurationPropertyCollection?Properties 
 ???????? { 
 ????????????get? {?return?_properties;?}  ????????}  ????}  }

Message
 using
?System; 
using
?System.Collections.Generic; 
using
?System.Configuration; 
using
?System.Web.Configuration; 

namespace
?Pattern.Provider 


{ 
 ????/**////?<summary>  ????///?暴露给客户端用的Message的类(Context)  ????///?</summary>  ????public?class?Message 
 ???? {  ????????private?static?bool?m_isInitialized?=?false;  ????????private?static?MessageProviderCollection?_providers?=?null;  ????????private?static?MessageProvider?_provider?=?null; 

 ????????/**////?<summary>  ????????///?静态构造函数,初始化  ????????///?</summary>  ????????static?Message() 
 ???????? {  ????????????Initialize();  ????????} 

 ????????/**////?<summary>  ????????///?插入信息  ????????///?</summary>  ????????///?<param?name="mm">Message实体对象</param>  ????????///?<returns></returns>  ????????public?static?bool?Insert(MessageModel?mm) 
 ???????? {  ????????????return?_provider.Insert(mm);  ????????} 

 ????????/**////?<summary>  ????????///?获取信息  ????????///?</summary>  ????????///?<returns></returns>  ????????public?static?List<MessageModel>?Get() 
 ???????? {  ????????????return?_provider.Get();  ????????} 
 ????????private?static?void?Initialize() 
 ???????? {  ????????????try 
 ???????????? {  ????????????????MessageProviderConfigurationSection?messageConfig?=?null; 
 ????????????????if?(!m_isInitialized) 
 ???????????????? { 
 ????????????????????//?找到配置文件中“MessageProvider”节点  ????????????????????messageConfig?=?(MessageProviderConfigurationSection)ConfigurationManager.GetSection("MessageProvider"); 
 ????????????????????if?(messageConfig?==?null)  ????????????????????????throw?new?ConfigurationErrorsException("在配置文件中没找到“MessageProvider”节点"); 
 ????????????????????_providers?=?new?MessageProviderCollection(); 
 ????????????????????//?使用System.Web.Configuration.ProvidersHelper类调用每个Provider的Initialize()方法  ????????????????????ProvidersHelper.InstantiateProviders(messageConfig.Providers,?_providers,?typeof(MessageProvider)); 
 ????????????????????//?所用的Provider为配置中默认的Provider  ????????????????????_provider?=?_providers[messageConfig.DefaultProvider]?as?MessageProvider; 
 ????????????????????m_isInitialized?=?true; 
 ????????????????}  ????????????}  ????????????catch?(Exception?ex) 
 ???????????? {  ????????????????string?msg?=?ex.Message;  ????????????????throw?new?Exception(msg);  ????????????}  ????????} 
 ????????private?static?MessageProvider?Provider 
 ???????? {  ????????????get 
 ???????????? {  ????????????????return?_provider;  ????????????}  ????????} 
 ????????private?static?MessageProviderCollection?Providers 
 ???????? {  ????????????get 
 ???????????? {  ????????????????return?_providers;  ????????????}  ????????}  ????}  }

Web.config
 <
configuration
>
 ??
<
configSections
>
 ????
<
section?
name
="MessageProvider"
?type
="Pattern.Provider.MessageProviderConfigurationSection,?Pattern.Provider"
?
/>
 ??
</
configSections
>
 ??
<
MessageProvider?
defaultProvider
="SqlMessageProvider"
>
 ????
<
providers
>
 ??????
<
add?
name
="XmlMessageProvider"
?type
="Pattern.Provider.XmlMessageProvider,?Pattern.Provider"
?connectionStringName
="XmlConnection"
?
/>
 ??????
<
add?
name
="SqlMessageProvider"
?type
="Pattern.Provider.SqlMessageProvider,?Pattern.Provider"
?connectionStringName
="SqlConnection"
?
/>
 ????
</
providers
>
 ??
</
MessageProvider
>
 ??
<
connectionStrings
>
 ????
<
add?
name
="SqlConnection"
?connectionString
="server=.;database=db;uid=sa;pwd=sa"
?
/>
 ????
<
add?
name
="XmlConnection"
?connectionString
="XmlPath"
?
/>
 ??
</
connectionStrings
>

</
configuration
>
Test
 using
?System; 
using
?System.Data; 
using
?System.Configuration; 
using
?System.Collections; 
using
?System.Web; 
using
?System.Web.Security; 
using
?System.Web.UI; 
using
?System.Web.UI.WebControls; 
using
?System.Web.UI.WebControls.WebParts; 
using
?System.Web.UI.HtmlControls; 

using
?Pattern.Provider; 

public
?partial?
class
?Provider?:?System.Web.UI.Page 


{  ????protected?void?Page_Load(object?sender,?EventArgs?e) 
 ???? {  ????????Response.Write(Message.Insert(new?MessageModel("插入",?DateTime.Now)));  ????????Response.Write("<br?/>");  ????????Response.Write(Message.Get()[0].Message?+?"?"?+?Message.Get()[0].PublishTime.ToString());  ????}  }
运行结果 True SQL方式,连接字符串是server=.;database=db;uid=sa;pwd=sa 2007-1-22 8:21:44 from:http://www.cnblogs.com/webabcd/archive/2007/01/22/626479.html OK
[源码下载]??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|