首页 > 其他 > 详细

乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

时间:2014-03-10 15:57:11      阅读:524      评论:0      收藏:0      [点我收藏+]
原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

[索引页]
[源码下载]


乐在其中设计模式(C#) - 提供者模式(Provider Pattern)


作者:webabcd


介绍
为一个API进行定义和实现的分离。


示例
有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里。根据配置文件中的配置来决定数据持久化方案是使用SqlServer数据库还是Xml文件。
bubuko.com,布布扣

MessageModel
bubuko.com,布布扣using System;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// Message实体类
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class MessageModel
bubuko.com,布布扣    
{
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 构造函数
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="msg">Message内容</param>
bubuko.com,布布扣        
/// <param name="pt">Message发布时间</param>

bubuko.com,布布扣        public MessageModel(string msg, DateTime pt)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
this._message = msg;
bubuko.com,布布扣            
this._publishTime = pt;
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
private string _message;
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// Message内容
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        public string Message
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get return _message; }
bubuko.com,布布扣            
set { _message = value; }
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
private DateTime _publishTime;
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// Message发布时间
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        public DateTime PublishTime
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get return _publishTime; }
bubuko.com,布布扣            
set { _publishTime = value; }
bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

MessageProvider
bubuko.com,布布扣using System.Configuration.Provider;
bubuko.com,布布扣
using System.Collections.Generic;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// 操作Message抽象类
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public abstract class MessageProvider : ProviderBase
bubuko.com,布布扣    
{
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 插入Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="mm">Message实体对象</param>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public abstract bool Insert(MessageModel mm);
bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 获得Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public abstract List<MessageModel> Get();
bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

SqlMessageProvider
bubuko.com,布布扣using System;
bubuko.com,布布扣
using System.Collections.Specialized;
bubuko.com,布布扣
using System.Collections.Generic;
bubuko.com,布布扣
bubuko.com,布布扣
using System.Configuration.Provider;
bubuko.com,布布扣
using System.Configuration;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// Sql方式操作Message
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class SqlMessageProvider : MessageProvider
bubuko.com,布布扣    
{
bubuko.com,布布扣        
private string _connectionString;
bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 插入Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="mm">Message实体对象</param>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public override bool Insert(MessageModel mm)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
// 代码略
bubuko.com,布布扣
            return true;
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 获取Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public override List<MessageModel> Get()
bubuko.com,布布扣        
{
bubuko.com,布布扣            List
<MessageModel> l = new List<MessageModel>();
bubuko.com,布布扣            l.Add(
new MessageModel("SQL方式,连接字符串是" + this._connectionString, DateTime.Now));
bubuko.com,布布扣
bubuko.com,布布扣            
return l;
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 初始化提供程序。
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="name">该提供程序的友好名称。</param>
bubuko.com,布布扣        
/// <param name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。</param>

bubuko.com,布布扣        public override void Initialize(string name, NameValueCollection config)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
if (string.IsNullOrEmpty(name))
bubuko.com,布布扣                name 
= "MessageProvider";
bubuko.com,布布扣
bubuko.com,布布扣            
if (null == config)
bubuko.com,布布扣                
throw new ArgumentException("config参数不能为null");
bubuko.com,布布扣
bubuko.com,布布扣            
if (string.IsNullOrEmpty(config["description"]))
bubuko.com,布布扣            
{
bubuko.com,布布扣                config.Remove(
"description");
bubuko.com,布布扣                config.Add(
"description""SqlServer操作Message");
bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            
base.Initialize(name, config);
bubuko.com,布布扣
bubuko.com,布布扣            
string temp = config["connectionStringName"];
bubuko.com,布布扣            
if (temp == null || temp.Length < 1)
bubuko.com,布布扣                
throw new ProviderException("connectionStringName属性缺少或为空");
bubuko.com,布布扣
bubuko.com,布布扣            _connectionString 
= ConfigurationManager.ConnectionStrings[temp].ConnectionString;
bubuko.com,布布扣            
if (_connectionString == null || _connectionString.Length < 1)
bubuko.com,布布扣            
{
bubuko.com,布布扣                
throw new ProviderException("没找到‘" + temp + "‘所指的连接字符串,或所指连接字符串为空");
bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            config.Remove(
"connectionStringName");
bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

XmlMessageProvider
bubuko.com,布布扣using System;
bubuko.com,布布扣
using System.Collections.Specialized;
bubuko.com,布布扣
using System.Collections.Generic;
bubuko.com,布布扣
bubuko.com,布布扣
using System.Configuration.Provider;
bubuko.com,布布扣
using System.Configuration;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// Xmll方式操作Message
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class XmlMessageProvider : MessageProvider
bubuko.com,布布扣    
{
bubuko.com,布布扣        
private string _connectionString;
bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 插入Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="mm">Message实体对象</param>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public override bool Insert(MessageModel mm)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
// 代码略
bubuko.com,布布扣
            return true;
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 获取Message
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public override List<MessageModel> Get()
bubuko.com,布布扣        
{
bubuko.com,布布扣            List
<MessageModel> l = new List<MessageModel>();
bubuko.com,布布扣            l.Add(
new MessageModel("XML方式,连接字符串是" + this._connectionString, DateTime.Now));
bubuko.com,布布扣
bubuko.com,布布扣            
return l;
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 初始化提供程序。
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="name">该提供程序的友好名称。</param>
bubuko.com,布布扣        
/// <param name="config">名称/值对的集合,表示在配置中为该提供程序指定的、提供程序特定的属性。</param>

bubuko.com,布布扣        public override void Initialize(string name, NameValueCollection config)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
if (string.IsNullOrEmpty(name))
bubuko.com,布布扣                name 
= "MessageProvider";
bubuko.com,布布扣
bubuko.com,布布扣            
if (null == config)
bubuko.com,布布扣                
throw new ArgumentException("config参数不能为null");
bubuko.com,布布扣
bubuko.com,布布扣            
if (string.IsNullOrEmpty(config["description"]))
bubuko.com,布布扣            
{
bubuko.com,布布扣                config.Remove(
"description");
bubuko.com,布布扣                config.Add(
"description""XML操作Message");
bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            
base.Initialize(name, config);
bubuko.com,布布扣
bubuko.com,布布扣            
string temp = config["connectionStringName"];
bubuko.com,布布扣            
if (temp == null || temp.Length < 1)
bubuko.com,布布扣                
throw new ProviderException("connectionStringName属性缺少或为空");
bubuko.com,布布扣
bubuko.com,布布扣            _connectionString 
= ConfigurationManager.ConnectionStrings[temp].ConnectionString;
bubuko.com,布布扣            
if (_connectionString == null || _connectionString.Length < 1)
bubuko.com,布布扣            
{
bubuko.com,布布扣                
throw new ProviderException("没找到‘" + temp + "‘所指的连接字符串,或所指连接字符串为空");
bubuko.com,布布扣            }

bubuko.com,布布扣
bubuko.com,布布扣            config.Remove(
"connectionStringName");
bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

MessageProviderCollection
bubuko.com,布布扣using System.Configuration.Provider;
bubuko.com,布布扣
using System;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// Message的Provider集合类
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class MessageProviderCollection : ProviderCollection
bubuko.com,布布扣    
{
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 向集合中添加提供程序。
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="provider">要添加的提供程序。</param>

bubuko.com,布布扣        public override void Add(ProviderBase provider)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
if (provider == null)
bubuko.com,布布扣                
throw new ArgumentNullException("provider参数不能为null");
bubuko.com,布布扣
bubuko.com,布布扣            
if (!(provider is MessageProvider))
bubuko.com,布布扣                
throw new ArgumentException("provider参数类型必须是MessageProvider.");
bubuko.com,布布扣
bubuko.com,布布扣            
base.Add(provider);
bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

MessageProviderConfigurationSection
bubuko.com,布布扣using System.Configuration;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// Message的Provider的配置
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class MessageProviderConfigurationSection : ConfigurationSection
bubuko.com,布布扣    
{
bubuko.com,布布扣        
private readonly ConfigurationProperty _defaultProvider;
bubuko.com,布布扣        
private readonly ConfigurationProperty _providers;
bubuko.com,布布扣        
private ConfigurationPropertyCollection _properties;
bubuko.com,布布扣        
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 构造函数
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        public MessageProviderConfigurationSection()
bubuko.com,布布扣        
{
bubuko.com,布布扣            _defaultProvider 
= new ConfigurationProperty("defaultProvider"typeof(string), null);
bubuko.com,布布扣            _providers 
= new ConfigurationProperty("providers"typeof(ProviderSettingsCollection), null);
bubuko.com,布布扣            _properties 
= new ConfigurationPropertyCollection();
bubuko.com,布布扣
bubuko.com,布布扣            _properties.Add(_providers);
bubuko.com,布布扣            _properties.Add(_defaultProvider);
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// Message的默认的Provider
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        [ConfigurationProperty("defaultProvider")]
bubuko.com,布布扣        
public string DefaultProvider
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get return (string)base[_defaultProvider]; }
bubuko.com,布布扣            
set base[_defaultProvider] = value; }
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// Message的所有的Provider集合
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        [ConfigurationProperty("providers", DefaultValue = "SqlMessageProvider")]
bubuko.com,布布扣        [StringValidator(MinLength 
= 1)]
bubuko.com,布布扣        
public ProviderSettingsCollection Providers
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get return (ProviderSettingsCollection)base[_providers]; }
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// Message的Provider的属性集合
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        protected override ConfigurationPropertyCollection Properties
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get return _properties; }
bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣

Message
bubuko.com,布布扣using System;
bubuko.com,布布扣
using System.Collections.Generic;
bubuko.com,布布扣
using System.Configuration;
bubuko.com,布布扣
using System.Web.Configuration;
bubuko.com,布布扣
bubuko.com,布布扣
namespace Pattern.Provider
bubuko.com,布布扣
{
bubuko.com,布布扣    
/// <summary>
bubuko.com,布布扣    
/// 暴露给客户端用的Message的类(Context)
bubuko.com,布布扣    
/// </summary>

bubuko.com,布布扣    public class Message
bubuko.com,布布扣    
{
bubuko.com,布布扣        
private static bool m_isInitialized = false;
bubuko.com,布布扣        
private static MessageProviderCollection _providers = null;
bubuko.com,布布扣        
private static MessageProvider _provider = null;
bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 静态构造函数,初始化
bubuko.com,布布扣        
/// </summary>

bubuko.com,布布扣        static Message()
bubuko.com,布布扣        
{
bubuko.com,布布扣            Initialize();
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 插入信息
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <param name="mm">Message实体对象</param>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public static bool Insert(MessageModel mm)
bubuko.com,布布扣        
{
bubuko.com,布布扣            
return _provider.Insert(mm);
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
/// <summary>
bubuko.com,布布扣        
/// 获取信息
bubuko.com,布布扣        
/// </summary>
bubuko.com,布布扣        
/// <returns></returns>

bubuko.com,布布扣        public static List<MessageModel> Get()
bubuko.com,布布扣        
{
bubuko.com,布布扣            
return _provider.Get();
bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
private static void Initialize()
bubuko.com,布布扣        
{
bubuko.com,布布扣            
try
bubuko.com,布布扣            
{
bubuko.com,布布扣                MessageProviderConfigurationSection messageConfig 
= null;
bubuko.com,布布扣
bubuko.com,布布扣                
if (!m_isInitialized)
bubuko.com,布布扣                
{
bubuko.com,布布扣
bubuko.com,布布扣                    
// 找到配置文件中“MessageProvider”节点
bubuko.com,布布扣
                    messageConfig = (MessageProviderConfigurationSection)ConfigurationManager.GetSection("MessageProvider");
bubuko.com,布布扣
bubuko.com,布布扣                    
if (messageConfig == null)
bubuko.com,布布扣                        
throw new ConfigurationErrorsException("在配置文件中没找到“MessageProvider”节点");
bubuko.com,布布扣
bubuko.com,布布扣                    _providers 
= new MessageProviderCollection();
bubuko.com,布布扣
bubuko.com,布布扣                    
// 使用System.Web.Configuration.ProvidersHelper类调用每个Provider的Initialize()方法
bubuko.com,布布扣
                    ProvidersHelper.InstantiateProviders(messageConfig.Providers, _providers, typeof(MessageProvider));
bubuko.com,布布扣
bubuko.com,布布扣                    
// 所用的Provider为配置中默认的Provider
bubuko.com,布布扣
                    _provider = _providers[messageConfig.DefaultProvider] as MessageProvider;
bubuko.com,布布扣
bubuko.com,布布扣                    m_isInitialized 
= true;
bubuko.com,布布扣
bubuko.com,布布扣                }

bubuko.com,布布扣            }

bubuko.com,布布扣            
catch (Exception ex)
bubuko.com,布布扣            
{
bubuko.com,布布扣                
string msg = ex.Message;
bubuko.com,布布扣                
throw new Exception(msg);
bubuko.com,布布扣            }

bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
private static MessageProvider Provider
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get
bubuko.com,布布扣            
{
bubuko.com,布布扣                
return _provider;
bubuko.com,布布扣            }

bubuko.com,布布扣        }

bubuko.com,布布扣
bubuko.com,布布扣        
private static MessageProviderCollection Providers
bubuko.com,布布扣        
{
bubuko.com,布布扣            
get
bubuko.com,布布扣            
{
bubuko.com,布布扣                
return _providers;
bubuko.com,布布扣            }

bubuko.com,布布扣        }

bubuko.com,布布扣    }

bubuko.com,布布扣}

bubuko.com,布布扣


Web.config
bubuko.com,布布扣<?xml version="1.0" encoding="utf-8"?>
bubuko.com,布布扣
<configuration>
bubuko.com,布布扣  
<configSections>
bubuko.com,布布扣    
<section name="MessageProvider" type="Pattern.Provider.MessageProviderConfigurationSection, Pattern.Provider" />
bubuko.com,布布扣  
</configSections>
bubuko.com,布布扣  
<MessageProvider defaultProvider="SqlMessageProvider">
bubuko.com,布布扣    
<providers>
bubuko.com,布布扣      
<add name="XmlMessageProvider" type="Pattern.Provider.XmlMessageProvider, Pattern.Provider" connectionStringName="XmlConnection" />
bubuko.com,布布扣      
<add name="SqlMessageProvider" type="Pattern.Provider.SqlMessageProvider, Pattern.Provider" connectionStringName="SqlConnection" />
bubuko.com,布布扣    
</providers>
bubuko.com,布布扣  
</MessageProvider>
bubuko.com,布布扣  
<connectionStrings>
bubuko.com,布布扣    
<add name="SqlConnection" connectionString="server=.;database=db;uid=sa;pwd=sa" />
bubuko.com,布布扣    
<add name="XmlConnection" connectionString="XmlPath" />
bubuko.com,布布扣  
</connectionStrings>
bubuko.com,布布扣
</configuration>
bubuko.com,布布扣

Test
bubuko.com,布布扣using System;
bubuko.com,布布扣
using System.Data;
bubuko.com,布布扣
using System.Configuration;
bubuko.com,布布扣
using System.Collections;
bubuko.com,布布扣
using System.Web;
bubuko.com,布布扣
using System.Web.Security;
bubuko.com,布布扣
using System.Web.UI;
bubuko.com,布布扣
using System.Web.UI.WebControls;
bubuko.com,布布扣
using System.Web.UI.WebControls.WebParts;
bubuko.com,布布扣
using System.Web.UI.HtmlControls;
bubuko.com,布布扣
bubuko.com,布布扣
using Pattern.Provider;
bubuko.com,布布扣
bubuko.com,布布扣
public partial class Provider : System.Web.UI.Page
bubuko.com,布布扣
{
bubuko.com,布布扣    
protected void Page_Load(object sender, EventArgs e)
bubuko.com,布布扣    
{
bubuko.com,布布扣        Response.Write(Message.Insert(
new MessageModel("插入", DateTime.Now)));
bubuko.com,布布扣        Response.Write(
"<br />");
bubuko.com,布布扣        Response.Write(Message.Get()[
0].Message + " " + Message.Get()[0].PublishTime.ToString());
bubuko.com,布布扣    }

bubuko.com,布布扣}

运行结果
True
SQL方式,连接字符串是server=.;database=db;uid=sa;pwd=sa 2007-1-22 8:21:44


OK
[源码下载]

乐在其中设计模式(C#) - 提供者模式(Provider Pattern),布布扣,bubuko.com

乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

原文:http://www.cnblogs.com/lonelyxmas/p/3590368.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!