原文:乐在其中设计模式(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. 使用Runtime.getRuntime().exec()方法的几个陷阱 (转)

    Process 子类的一个实例,该实例可用来控制进程并获得相关信息.Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉)进程的方法. 创建进程的方法 ...

  2. [Ext JS 4] Extjs 它 initComponent 和 constructor差分

    initComponent 和 constructor是什么 Extjs 提供的组件还是挺丰富的, 可是有时候需求更丰富. 当Extjs 原生的组件无法实现我们的要求的时候, 就须要扩展Extjs 的 ...

  3. 黑马程序猿_ 利用oc的协议实现代理模式

    先说下代理模式是什么吧 定义: 为其它对象提供一种代理以控制对这个对象的訪问.在某些情况下,一个对象不适合或者不能直接引用还有一个对象 而代理对象能够在client和目标对象之间起到中介的作用. 在看 ...

  4. 如何解决This system is not registered with RHN.

    今天我必须写下这篇文章,由于在我刚刚接触到Linux下安装oracle时碰到了Linux中少xscreensaver.rpm包自己弄了非常久.最后还是被一个大哥帮我攻克了:仅仅能说非常的感谢你! 我试 ...

  5. SE 2014年5月27日

    R1模拟总部,R2 与R3模拟分部 如图配置 要求使用 GRE over IPSec VPN 主模式,启用动态路由协议rip使得总部与两分部内网可相互通讯,但要求分部用户数据流不允许互通! 步骤: 1 ...

  6. shufe前辈名师

    前辈名师 姓名 现职/原职 郭秉文 中国现代大学之父.国立东南大学校长.哥伦比亚大学教育学博士,该校第一任校长.为了纪念郭秉文先生,勉励优秀学子,郭夏瑜女士在上海财经大学等校设立了“郭秉文奖学金” 马 ...

  7. Quartz时间配置

    格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明  是否必填  允许填写的值 允许的通配符  1  秒  是  0-59    , - * /  2  分  是  0-5 ...

  8. 使用配置文件(.settings、.config)存储应用程序配置

    原文:使用配置文件(.settings..config)存储应用程序配置 引言 我不知大家早先是如何保存应用程序配置,以备下次打开时使用的,反正我开始学.Net的时候就去研究序列化,以二进制或XML格 ...

  9. [C++基金会]位计算 游戏开发中的应用

    定义的位操作:通俗点说,,位计算是计算机操作二进制整数. 无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的.INT8要么char靠8个月2 位表示,INT16或者short是由1 ...

  10. [Unity3D]Unity3D持久性数据的游戏开发PlayerPrefs采用

    大家好,我是秦培,欢迎关注我的博客,我的博客地址">blog.csdn.net/qinyuanpei. 博主今天研究了在Unity3D中的数据持久化问题.数据持久化在不论什么一个开发领 ...