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

2023-11-12

设计模式 - 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 [源码下载]  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式 - Provider Pattern(提供者模式) 的相关文章

  • 将 xmllint 和 xpath 与不太完美的 HTML 文档一起使用?

    我有一个由现有工具生成的 HTML 页面 我无法更改该工具的输出 但是 我想用xmllint与 xpath从下载的网页中挑选一些特定信息的选项 问题是页面开头为 And xmllint几乎立即抛出错误 html out 2 parser e
  • 将单个列连接到逗号分隔的列表中[重复]

    这个问题在这里已经有答案了 我已经看到了人们将单个列滚动到逗号分隔列表中的多个示例 但我需要更多 这是我需要的数据和结果的示例 DECLARE SalesPerson table SalesPersonID int SalesPersonN
  • 使用 PHP 从 XML 文件重新调整多个动态结果的 XPATH 方法

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个用户输入或选择一个值的表单
  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • 查询所有表数据并进行索引压缩

    是否有人碰巧拥有一个通用 SQL 语句 可以列出数据库中每个分区的所有表和索引及其当前的压缩设置 Thanks 编辑 这是我尝试查询表所得到的 但我不确定连接是否正确 我得到了重复项 这似乎是由于索引的存在引起的 SELECT t name
  • 无法在 SSIS 2012 上使用敏感项目参数

    在 SSIS 2012 中 我尝试对 Oracle 的 OLEDB 连接使用敏感项目参数 它与 Sensitive 属性设置为完美配合FALSE 在项目参数设计器中 但我不希望密码像那样可见 一旦我将敏感属性设置为TRUE并尝试执行我的包
  • 获取 Wi-Fi 配置文件信息

    我使用的是 Windows 8 1 它没有工具 带有 GUI 来管理 wifi 网络配置文件 所以我正在写一篇对我有帮助的文章 我做了一些谷歌搜索并发现托管 Wifi API https managedwifi codeplex com 并
  • 获取对 SOAP 的 XML 响应中的节点值

    我在 PowerShell 中发出 SOAP 请求 如下所示 uri https secure echosign com services EchoSignDocumentService20 WSDL sun Invoke WebReque
  • 使用 Switch 的报告服务表达式

    我无法让这个表达式与报告服务一起使用 我必须使用 IF 和 ELSE IF 语句 感谢您的任何建议 Switch IsNothing Fields field date Value Fields set flag Value 1 Decli
  • 具有模型导入功能的免费 opc ua 服务器

    我想为我的应用程序实现 OPC UA 通信 c 我发现一些 OPC UA 服务器模拟 Prosys 和 Softing OPC UA 我可以毫无问题地连接和读取数据 我想要的是实施 Euromap 77 标准 http www euroma
  • 获取家庭成员

    假设以下家庭 其构建架构是 create table PersonConn child int parent int insert into PersonConn values 1 2 insert into PersonConn valu
  • 如何使用 DateTime 执行 SQL NOT NULL?

    一个人如何处理DateTime with a NOT NULL 我想做这样的事情 SELECT FROM someTable WHERE thisDateTime IS NOT NULL But how 嗯 它有效吗 我刚刚测试过 Obje
  • 在以下情况下强制 EditText 失去焦点:按下某些键盘按键以及当用户单击活动中的其他内容时

    我知道这个问题之前已经以多种不同的方式提出过 但即使我已经查看了许多有关 EditText 焦点的其他相关问题 我还没有找到我的解决方案 这是我想要实现的目标 当用户完成编辑 EditText 后 我 希望它失去焦点 当用户点击 EditT
  • 使用ASP/VB获取节点属性值

    我有以下 XML 架构
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 当responseText包含有效的Xml时,IXMLHttpRequest.responseXml为空,没有解析错误

    我正在从中获取一些 XML政府网站 http www bankofcanada ca stats assets rates rss noon en all xml http www bankofcanada ca stats assets
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • XSD 嵌套元素

  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和

随机推荐

  • ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传

    上传视频 uploadVideo function let this this let list camera album wx showActionSheet itemList 拍摄视频 从相册选择视频 从视频库选择视频 success
  • Kubernets之Node、Pod和容器的关系

    Pod根据调度配置分布在Node上 一个Pod可以包含多个容器 Pod中最少存在一个容器 Pause 且Pod内任何容器端口不能冲突 Pod中 所有容器共享网络栈和存储卷 因此可以通过localhost访问同一个Pod中的其他不同容器的资源
  • A类、B类、AB类、C类、D类功率放大电路的区别与基本定义

    总述 功率放大电路常用于多级放大电路的末级 集成功率放大器 集成运算放大器等模拟集成电路的输出级 功率放大电路主要应用于要求具有较高的输出功率或要求具有较大的输出动态范围的情况下 功率放大器可以分为A类 B类 AB类 C类 D类等 A类功率
  • 安装DirectX SDK时出现Error Code:s1023 的解决方案

    今天安装DXSDK Jun10时 下载地址 http download microsoft com download A E 7 AE743F1F 632B 4809 87A9 AA1BB3458E31 DXSDK Jun10 exe 出现
  • 网络排查汇总: traceroute 、mtr、ping、nslookup、dig

    最近很多时候都遇到玩家访问服务器失败的情况 这里整理了一下相关linux命令 还有一些测试网站 工具等 traceroute 实现原理 1 从源地址发出一个UDP探测包到目的地址 并将TTL设置为1 2 到达路由器时 将TTL减1 3 当T
  • 链表和数组的排序---持续更新

    链表的排序 1 对链表使用插入排序 第一步 判断链表是否为空 如果为空 不需要进行排序 直接返回 第二步 数组的排序 1 快速排序 第一步 选定中心轴 pivot 第二步 小于中心轴的放左边 第三步 大于中心轴的放右边 第四步 递归调用 p
  • Tomcat部署项目中含有中文文件访问404解决方法

    背景 Tomcat部署了Axure UI设计原型文件 很多中文菜单 访问英文网页正常 访问中文菜单网页报404 尝试了很多方法 最终通过配置Tomcat conf文件夹下的server xml解决问题 解决方法 修改server xml文件
  • Shell:查看进程与对应的线程

    1 通过 ps efL grep 进程ID或名字 UID PID PPID LWP C NLWP STIME TTY TIME CMD user 228298 201990 228298 0 2 00 14 pts 0 00 00 00 t
  • HDU 1042 N!大数乘法

    N Time Limit 10000 5000ms Java Other Memory Limit 262144 262144K Java Other Total Submission s 69 Accepted Submission s
  • linux-redis设置密码

    redis设置密码 linux版 到redis cli命令所在目录 cd usr local redis bin 打开客户端 redis cli 查看密码 config get requirepass 设置密码 config set req
  • 玩转树莓派4B之Uboot移植

    此文参考了以下文章 https blog csdn net weixin 42233878 article details 84980951 个人使用的编译环境为ubuntu1904 64位 我的目的是修改树莓派的uboot代码并且看下深入
  • 30 个 Python 的最佳实践、小贴士和技巧

    以下为译文 想借本文为大家献上 Python 语言的30个最佳实践 小贴士和技巧 希望能对各位勤劳的程序员有所帮助 并希望大家工作顺利 1 Python 版本 在此想提醒各位 自2020年1月1日起 Python 官方不再支持 Python
  • 现场总线和工业以太网

    随着传统制造企业正在加快智能制造转型的进程 工业互联网迅速在全世界范围内兴起 在工业互联网的技术构架中 通过各类通讯方式接入不同设备 系统和产品 来采集海量数据是其重要的一环 本文将介绍工业底层设备的两种通讯方式 现场总线和工业以太网 一
  • 容器集群k8s从入门到精通之 Pod详解(第五章)

    第五章 Pod详解 本章节将详细介绍Pod资源的各种配置 yaml 和原理 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器 这些容器可以分为两类 用户程序所在的容器 数量可多可少 Pause容器 这是每个Pod都会有的一个根
  • 12款AI代码生成工具,都很能打

    1 Anania Anania 是一个机器人数据分析师 可以通过简单 自然的英语对话来分析您的数据 连接数据源并以简单的英语提问 无需任何设置或配置 在幕后 Anania 正在使用一个 AI 系统 该系统将文本转换为 SQL 和 Pytho
  • 数值分析与matlab学习笔记——多项式插值法

    文章目录 多项式插值 一点背景 多项式插值的存在唯一性 Lagrange插值法 n次插值基函数 拉格朗日插值函数 matlab代码及效果 Newton插值 均差 差商 均差的三种理解 N 基函数 牛顿插值函数 matlab代码及效果 误差分
  • openGL之API学习(一零六)wglGetProcAddress

    获取当前显卡中OpenGL函数的指针地址 PROC wglGetProcAddress LPCSTR Arg1 Arg1 Points to a null terminated string that is the name of the
  • 学习Linux命令的正确姿势

    大家好 我是良许 大家应该注意到了 最近我的公众号文章末尾都挂着自己录制的 Linux命令从小白到大神 课程 这个课程我从开始录制到制作完成 足足花了一个半月 如果加上前期的资料收集与教案准备 肯定有将近三个月 首先跟大家讲讲我为什么要开发
  • 电器元件——LM7805

    LM7805是一款常用的线性三端稳压IC 其外形封装虽然有多种 但输出电压皆为5V 区别就是封装不同 最大输出电流可能不一样 最常用的是如下图所示的TO 220封装的7805 TO 220封装的7805 上图所示的这种封装的7805 最高输
  • 设计模式 - Provider Pattern(提供者模式)

    设计模式 Provider Pattern 提供者模式 作者 webabcd 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml