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

本文介绍了一种消息提供者模式的实现方式,包括定义消息提供者集合类、配置节类和消息类等关键组件,并通过具体示例展示了如何在.NET环境中配置和使用多种消息提供者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MessageProviderCollection
InBlock.gif using System.Configuration.Provider; 
InBlock.gif using System; 
InBlock.gif 
InBlock.gif namespace Pattern.Provider 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Message的Provider集合类 
InBlock.gif         /// </summary> 
InBlock.gif         public  class MessageProviderCollection : ProviderCollection 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 向集合中添加提供程序。 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="provider">要添加的提供程序。</param> 
InBlock.gif                 public  override  void Add(ProviderBase provider) 
InBlock.gif                { 
InBlock.gif                         if (provider ==  null
InBlock.gif                                 throw  new ArgumentNullException( "provider参数不能为null"); 
InBlock.gif 
InBlock.gif                         if (!(provider  is MessageProvider)) 
InBlock.gif                                 throw  new ArgumentException( "provider参数类型必须是MessageProvider."); 
InBlock.gif 
InBlock.gif                         base.Add(provider); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
MessageProviderConfigurationSection
InBlock.gif using System.Configuration; 
InBlock.gif 
InBlock.gif namespace Pattern.Provider 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// Message的Provider的配置 
InBlock.gif         /// </summary> 
InBlock.gif         public  class MessageProviderConfigurationSection : ConfigurationSection 
InBlock.gif        { 
InBlock.gif                 private  readonly ConfigurationProperty _defaultProvider; 
InBlock.gif                 private  readonly ConfigurationProperty _providers; 
InBlock.gif                 private ConfigurationPropertyCollection _properties; 
InBlock.gif                 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 构造函数 
InBlock.gif                 /// </summary> 
InBlock.gif                 public MessageProviderConfigurationSection() 
InBlock.gif                { 
InBlock.gif                        _defaultProvider =  new ConfigurationProperty( "defaultProvider"typeof( string),  null); 
InBlock.gif                        _providers =  new ConfigurationProperty( "providers"typeof(ProviderSettingsCollection),  null); 
InBlock.gif                        _properties =  new ConfigurationPropertyCollection(); 
InBlock.gif 
InBlock.gif                        _properties.Add(_providers); 
InBlock.gif                        _properties.Add(_defaultProvider); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message的默认的Provider 
InBlock.gif                 /// </summary> 
InBlock.gif                [ConfigurationProperty( "defaultProvider")] 
InBlock.gif                 public  string DefaultProvider 
InBlock.gif                { 
InBlock.gif                        get {  return ( string) base[_defaultProvider]; } 
InBlock.gif                        set {  base[_defaultProvider] = value; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message的所有的Provider集合 
InBlock.gif                 /// </summary> 
InBlock.gif                [ConfigurationProperty( "providers", DefaultValue =  "SqlMessageProvider")] 
InBlock.gif                [StringValidator(MinLength = 1)] 
InBlock.gif                 public ProviderSettingsCollection Providers 
InBlock.gif                { 
InBlock.gif                        get {  return (ProviderSettingsCollection) base[_providers]; } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// Message的Provider的属性集合 
InBlock.gif                 /// </summary> 
InBlock.gif                 protected  override ConfigurationPropertyCollection Properties 
InBlock.gif                { 
InBlock.gif                        get {  return _properties; } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
Message
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Web.Configuration; 
InBlock.gif 
InBlock.gif namespace Pattern.Provider 
InBlock.gif
InBlock.gif         /// <summary> 
InBlock.gif         /// 暴露给客户端用的Message的类(Context) 
InBlock.gif         /// </summary> 
InBlock.gif         public  class Message 
InBlock.gif        { 
InBlock.gif                 private  static  bool m_isInitialized =  false
InBlock.gif                 private  static MessageProviderCollection _providers =  null
InBlock.gif                 private  static MessageProvider _provider =  null
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 静态构造函数,初始化 
InBlock.gif                 /// </summary> 
InBlock.gif                 static Message() 
InBlock.gif                { 
InBlock.gif                        Initialize(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 插入信息 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <param name="mm">Message实体对象</param> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  static  bool Insert(MessageModel mm) 
InBlock.gif                { 
InBlock.gif                         return _provider.Insert(mm); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 获取信息 
InBlock.gif                 /// </summary> 
InBlock.gif                 /// <returns></returns> 
InBlock.gif                 public  static List<MessageModel> Get() 
InBlock.gif                { 
InBlock.gif                         return _provider.Get(); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  static  void Initialize() 
InBlock.gif                { 
InBlock.gif                         try 
InBlock.gif                        { 
InBlock.gif                                MessageProviderConfigurationSection messageConfig =  null
InBlock.gif 
InBlock.gif                                 if (!m_isInitialized) 
InBlock.gif                                { 
InBlock.gif 
InBlock.gif                                         // 找到配置文件中“MessageProvider”节点 
InBlock.gif                                        messageConfig = (MessageProviderConfigurationSection)ConfigurationManager.GetSection( "MessageProvider"); 
InBlock.gif 
InBlock.gif                                         if (messageConfig ==  null
InBlock.gif                                                 throw  new ConfigurationErrorsException( "在配置文件中没找到“MessageProvider”节点"); 
InBlock.gif 
InBlock.gif                                        _providers =  new MessageProviderCollection(); 
InBlock.gif 
InBlock.gif                                         // 使用System.Web.Configuration.ProvidersHelper类调用每个Provider的Initialize()方法 
InBlock.gif                                        ProvidersHelper.InstantiateProviders(messageConfig.Providers, _providers,  typeof(MessageProvider)); 
InBlock.gif 
InBlock.gif                                         // 所用的Provider为配置中默认的Provider 
InBlock.gif                                        _provider = _providers[messageConfig.DefaultProvider]  as MessageProvider; 
InBlock.gif 
InBlock.gif                                        m_isInitialized =  true
InBlock.gif 
InBlock.gif                                } 
InBlock.gif                        } 
InBlock.gif                         catch (Exception ex) 
InBlock.gif                        { 
InBlock.gif                                 string msg = ex.Message; 
InBlock.gif                                 throw  new Exception(msg); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  static MessageProvider Provider 
InBlock.gif                { 
InBlock.gif                        get 
InBlock.gif                        { 
InBlock.gif                                 return _provider; 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  static MessageProviderCollection Providers 
InBlock.gif                { 
InBlock.gif                        get 
InBlock.gif                        { 
InBlock.gif                                 return _providers; 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif}
 
Web.config
<?xml version="1.0" encoding="utf-8"?> 
<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
InBlock.gif using System; 
InBlock.gif using System.Data; 
InBlock.gif using System.Configuration; 
InBlock.gif using System.Collections; 
InBlock.gif using System.Web; 
InBlock.gif using System.Web.Security; 
InBlock.gif using System.Web.UI; 
InBlock.gif using System.Web.UI.WebControls; 
InBlock.gif using System.Web.UI.WebControls.WebParts; 
InBlock.gif using System.Web.UI.HtmlControls; 
InBlock.gif 
InBlock.gif using Pattern.Provider; 
InBlock.gif 
InBlock.gif public partial  class Provider : System.Web.UI.Page 
InBlock.gif
InBlock.gif         protected  void Page_Load( object sender, EventArgs e) 
InBlock.gif        { 
InBlock.gif                Response.Write(Message.Insert( new MessageModel( "插入", DateTime.Now))); 
InBlock.gif                Response.Write( "<br />"); 
InBlock.gif                Response.Write(Message.Get()[0].Message +  " " + Message.Get()[0].PublishTime.ToString()); 
InBlock.gif        } 
InBlock.gif}
 
 
运行结果
True
SQL方式,连接字符串是server=.;database=db;uid=sa;pwd=sa 2007-1-22 8:21:44


OK
[源码下载]



     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344595,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值