原文:乐在其中设计模式(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"];

            )

                throw new ProviderException("connectionStringName属性缺少或为空");



            _connectionString = ConfigurationManager.ConnectionStrings[temp].ConnectionString;

            )

            {

                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"];

            )

                throw new ProviderException("connectionStringName属性缺少或为空");



            _connectionString = ConfigurationManager.ConnectionStrings[temp].ConnectionString;

            )

            {

                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 )]

        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()[].PublishTime.ToString());

    }

}

运行结果

True

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





OK

[源码下载]

乐在其中设计模式(C#) - 提供者模式(Provider Pattern)的更多相关文章

  1. 二十四种设计模式:提供者模式(Provider Pattern)

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

  2. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  3. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  4. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  5. 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern)

    原文:乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 备忘录模式(Memento Pattern) 作者:webabc ...

  6. 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)

    原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...

  7. 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern)

    原文:乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 解释器模式(Interpreter Pattern) 作 ...

  8. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  9. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

随机推荐

  1. jQuery 顶部导航尾随滚动,固定浮动在顶部

    jQuery 顶部导航尾随滚动.固定浮动在顶部 演示 XML/HTML Code <section> <article class="left"> < ...

  2. Linux目录文件详解FHS标准(2013.09.05)

    Linux 目录配置的依据FHS(Filesystem Hierarchy Standard)标准,将目录分成为四种交互作用的形态: 四种形态的具体解释: 可分享的:可以分享给其他系统挂载使用的目录, ...

  3. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)

    题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. C# 计算字符串/文件的哈希值(MD5、SHA)

    原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...

  5. 使用MYCAT作为Mysql HA的中间件(转)

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  6. hdu4602(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4602 题意:对于每个数的分解,列出其元素的出现的个数. 1    2   3    4    5 1  ...

  7. Android圆弧形ListView的实现

    本文带大家来实现ListView的圆弧形的分布排列,原理非常easy,就是依据ListView的每个Item的高度来对每个item进行偏移. 首先自己定义一个LinearLayout,这是ListVi ...

  8. HTML5 CSS3专题 纯CSS打造相冊效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30993277 今天偶然发现电脑里面还有这种一个样例.感觉效果还不错,不记得啥时候 ...

  9. Failed to load libGL.so问题解决

    Ubuntu 14.04下启动模拟设备Android 4.2.2的时候报错: failed to load libgl.so 先用locate 命令定位libGL库, 然后加入�一个链接就可以: de ...

  10. 基于.net开发chrome核心浏览器【三】

    原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...