设计模式 - 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(提供者模式) 的相关文章

  • SQL最近的命令?微软SQL

    我只是编写一个查询来查看我的客户数据库并列出他们下了多少订单等 我正在努力添加到此查询中的是只显示该电子邮件的最新 OrderID 有任何想法吗 这是我的查询 select top 1000 BuyerEMail COUNT HowMany
  • XML 模式不区分大小写的简单类型字符串枚举

    我的 XML 架构 xsd 文件中需要不区分大小写的字符串枚举类型 我可以通过执行以下操作来不区分大小写
  • XML 和 INI 哪个更快?

    我想知道 XML 是否比 INI 更快 反之亦然 我正在开发一个包含许多文件的网站 这个问题与我的问题有关关于包含许多文件 https stackoverflow com questions 7777522 too many include
  • 有没有适用于 Eclipse 的 SQL 格式化插件?

    我在网上没有找到任何标准的开源 sql 格式化程序 eclipse 插件 我正在使用日食太阳神 我可以找到编辑 gt 格式化SQL但这似乎不起作用 找到一个在http ventralnet blogspot in 2010 11 sql b
  • PHP 读取 XML 播客 RSS 源

    好的 我正在为朋友的播客网站创建一个页面 列出他的播客的所有剧集 本质上 我所寻找的只是如何阅读 RSS 提要 解析出节点 并将信息显示在屏幕上 最终 我将创建一个可以播放剧集的播放器 但那是很久以后的事了 这就是我阅读 RSS 源的方式
  • 从另一个表中选择范围之间的记录

    我有两张桌子 比如说Table1 and Table2 Table1 ID RN 11 1 12 2 13 3 14 4 15 5 16 6 17 7 18 8 19 9 10 10 Table2 ID FromRN ToRN 1 1 3
  • 将 MS Access 连接到网络上的 SQL Server

    我在 Windows 服务器上安装了 SQL Server Express 我有 10 个人在本地 PC 上安装了 MS Access 2016 假设数据库非常小且简单 连接 SQL Server 最简单的方法是什么 简单的 ODBC 可以
  • SQL Server 2017 快速安装失败

    我尝试在 Windows 10 上安装 SQL Server 2017 Express 但失败 这是失败后向我显示的详细信息 Action required Use the following information to resolve
  • 单击“发送”按钮事件时,我们可以在哪里获取 xml/元数据格式的表单数据?

    我是一个新的 scala 学习者 作为要求的一部分 我需要将表单数据插入 activemq 队列中以进行提交事件 我尝试调试发送方法代码 以了解单击 FormRunnerActions scala 类中的发送按钮时我们到底在哪里获取 xml
  • T-SQL - 是否有(免费)方法来比较两个表中的数据?

    I have table a and table b SQL Server 2008 两个表具有完全相同的架构 出于本问题的目的 请考虑table a 我的本地开发表 table b 实时表 我需要创建一个 SQL 脚本 包含UPDATE
  • 我可以采取哪些措施来提高 SQL Server 中纯用户定义函数的性能?

    我制作了一个简单但计算相对复杂的 UDF 用于查询很少更改的表 在典型用法中 该函数会在一个非常小的参数域上从 WHERE 子句中多次调用 如何才能更快地使用 UDF 我的想法是应该有某种方式告诉 SQL Server 我的函数使用相同的参
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n
  • 查看与存储过程连接的结果

    我在 SQL Server 中有一个由应用程序使用的现有视图 我需要加入从存储过程返回的表 存储过程会执行很多操作 例如在返回结果之前插入多个 temp 表 我尝试将存储过程转换为表值函数 但是插入 TVF 内的临时表会导致编译错误 我还有
  • python中的编码检测库[重复]

    这个问题在这里已经有答案了 这在某种程度上与我的问题有关here https stackoverflow com questions 2305997 unicodedecodeerror problem with mechanize 我处理
  • Android 矩形有两种不同的颜色

    如何通过使用两种不同颜色和阴影来创建矩形形状 就像上图一样 Please create a drawable file and put the below code in it
  • 使用实用程序批量复制将所有表从 SQL Server 数据库导出到文件中

    我想将数据库中的所有表 bcp 到文件中 SELECT EXEC xp cmdshell bcp bcp QUOTENAME DB NAME database name QUOTENAME SCHEMA NAME SCHEMA ID sch
  • 调试 xslt 的工具

    我有一个 Java servlet 它生成 XML 使用 XSLT 样式表对其进行翻译 然后显示生成的 HTML 这是我第一次使用 XSLT 调试 XSLT 的好方法是什么 我也有 或可以获得 一些示例 XML 文件来应用转换 但我什至不确
  • 在 ms-sql 中查找最近的位置

    我将这些参数发送给我的脚本 纬度 41 0186 经度 28 964701 它是示例 我想找到最近的位置的名称 这个怎么做 查询必须更改代码的位置 sql查询 SELECT Name FROM Location WHERE Latitude
  • 连接到 SQL Server 数据库 C#-WinForms

    我正在制作一个桌面应用程序 我希望用户必须登录才能充分使用该程序 我已经在 www winhost com 我的网站的托管位置 上创建了一个数据库 但现在我不知道该怎么办 我一直在使用 google 和 msdn 我想知道如何以编程方式将新
  • 实体框架死锁问题

    我在使用 NET 4 的新实体框架时遇到了一个奇怪的问题 我有一个 SQL Server 2005 EXPRESS 数据库 我的服务使用实体框架将数据写入两个表 假设表是 TableA 和 TableB TableB 具有 TableA 的

随机推荐

  • 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