原文:乐在其中设计模式(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. Hibernate学习之createSQLQuery与createQuery的区别及使用

    hibernate中createQuery与createSQLQuery:前者用的hql语句进行查询,后者可以用sql语句查询,前者以hibernate生成的Bean为对象装入list返回,后者则是以 ...

  2. VMware vSphere服务器虚拟化实验十一高可用性之三Fault Tolerance

                                                                VMware vSphere服务器虚拟化实验十一高可用性之三Fault Tole ...

  3. Deep learning From Image to Sequence

    本文笔记旨在概括地讲deep learning的经典应用.内容太大,分三块. ------------------------------------------------------------- ...

  4. Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架

    Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 ...

  5. zend framework将zip格式的压缩文件导入并解压到指定文件

    html代码 <pre class="php" name="code"><fieldset> <legend>批量导入学生照 ...

  6. MBR格式无法识别2T以上的硬盘的问题

    早上有人打电话说四块2T的sata 硬盘做了raid 5之后安装window server 2012的时候,无法创建分区,安装完系统后无法给剩余的硬盘创建分区,刚开始的时候我还以为是别人分区的数量问题 ...

  7. UVA12304 2D Geometry 110 in 1! 计算几何

    计算几何: 堆几何模版就能够了. . .. Description Problem E 2D Geometry 110 in 1! This is a collection of 110 (in bi ...

  8. Lua 与C 交换 第一篇

    编译 windows上编译lua源代码 cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c del *.o ren lua.obj lua.o ren luac.obj ...

  9. xpages的comboBox能够手动输入

    在xpages使用的comboBox默认仅仅能选择.不能手动输入,怎么才干手动输入呢?经过查找资料和測试,最终能够了,请大家能够试试 假设试不行,能够再下载demo http://download.c ...

  10. Windows phone 8 学习笔记(4) 应用的启动

    原文:Windows phone 8 学习笔记(4) 应用的启动 Windows phone 8 的应用除了可以直接从开始菜单以及应用列表中打开外,还可以通过其他的方式打开.照片中心.音乐+视频中心提 ...