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

简介: 原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern)[索引页][源码下载]乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:webabcd 介绍 为一个API进行定义和实现的分离。
原文: 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

[索引页]
[源码下载]


乐在其中设计模式(C#) - 提供者模式(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
<? 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
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


OK
[源码下载]
目录
相关文章
|
5月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
147 16
|
5月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
144 0
|
5月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
136 0
|
5月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
109 0
|
5月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
10月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
525 11
|
4月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
129 0
|
5月前
|
设计模式 Prometheus 监控
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
174 0
|
9月前
|
JSON C# 数据格式
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
193 73
|
7月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。

热门文章

最新文章