加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

设计模式 - Provider Pattern(提供者模式)

发布时间:2020-12-12 16:00:42 所属栏目:MsSql教程 来源:网络整理
导读:设计模式 - Provider Pattern(提供者模式) 作者: webabcd 介绍 为一个API进行定义和实现的分离。 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。根据配置文件中的配置来决定数据持久化方案是使用
设计模式 - 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
[源码下载]??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读