Provider 模式:为一个API进行定义和实现的分离。

常见场景:DBPrider切换,第3方集成API切换

以发邮件为例:

Email Provider Config:

    public abstract class EmailProvider : ProviderBase
{
#region Public Methods and Operators public abstract EmailResponse SendEmail(ApiSetting apiSetting, EmailContent content); #endregion
} public sealed class EmailProviderCollection : ProviderCollection
{
#region Public Indexers public new EmailProvider this[string name]
{
get { return (EmailProvider) base[name]; }
} #endregion
} public sealed class EmailProviderConfiguration : ConfigurationSection
{
#region Public Properties /// <summary>
/// Gets the default provider name.
/// </summary>
[ConfigurationProperty("default", DefaultValue = "EDMProvider")]
public string DefaultProviderName
{
get { return base["default"] as string; }
} /// <summary>
/// Gets the providers.
/// </summary>
[ConfigurationProperty("providers")]
public ProviderSettingsCollection Providers
{
get { return (ProviderSettingsCollection) base["providers"]; }
} #endregion
} public static class EmailProviderManager
{
#region Static Fields private static readonly EmailProviderCollection Providers = new EmailProviderCollection(); #endregion #region Constructors and Destructors /// <summary>
/// Initializes static members of the <see cref="EmailProviderConfiguration" /> class.
/// </summary>
static EmailProviderManager()
{
Initialize();
} #endregion #region Public Properties /// <summary>
/// Gets the default.
/// </summary>
public static EmailProvider EmailProvider { get; private set; } #endregion #region Methods /// <summary>
/// Reads the configuration related to the set of configured
/// providers and sets the default and collection of providers and settings.
/// </summary>
private static void Initialize()
{
try
{
var section = (EmailProviderConfiguration) ConfigurationManager.GetSection("EmailProviders"); if (section == null)
{
throw new ConfigurationErrorsException("Email Provider Section is not set");
} ProvidersHelper.InstantiateProviders(section.Providers, Providers, typeof (EmailProvider)); if (Providers[section.DefaultProviderName] == null)
{
throw new ConfigurationErrorsException("Email provider is not set");
} EmailProvider = Providers[section.DefaultProviderName];
}
catch (Exception ex)
{
Log.Debug(ex.Message, ex);
}
}

EDMProvider

  public sealed class EDMProvider : EmailProvider
{
#region Public Methods and Operators public override EmailResponse SendEmail(ApiSetting apiSetting, EmailContent content)
{
。。。。
}
}

Configuration:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <configSections>
<section name="EmailProviders" type="AAA.Mail.Configuration.EmailProviderConfiguration, AAA.Mail" />
</configSections> <EmailProviders default="EDMProvider">
<providers>
<add name="EDMProvider" type="AAA.Mail.EDM.EDMProvider, AAA.Mail.EDM" />
</providers>
</EmailProviders> </configuration>

  

使用:

EmailProviderManager.EmailProvider .SendEmail (.....)

上面是一种provider提供的功能,只能用一种API实现。

下面这个链接是,一种provider提供的功能, 会有多种API的实现,用户可能选择不同的api.

http://www.cnblogs.com/webabcd/archive/2007/01/22/626479.html

Provider 模式的更多相关文章

  1. ASP.NET Provider模式应用之SqlMembershipProvider类的剖析

    太多了,先给个流程图吧 Provider模式就是GOF中的两种设计模式的应用:策略模式和工厂模式,在程序中使用好这个模型能够解除模块与模块之间的耦合甚至是DIP,同时,不管是ASP.NET MVC还是 ...

  2. provider模式

    最近看代码有所感想吧.当底层API,发生变化时,可以使用Provider模式.既然是模式就一定的股则. 1.该模式对原有接口的封装. 2.该模式实现对API的封装,不显示细节,从而取消依赖关系. 3. ...

  3. Provider模式应用demo

    参考ObjectPool对象池设计原理还原一个简易的Provider模式. using System; using System.Dynamic; using System.Reflection.Me ...

  4. Pipeline模式与Factory+Provider模式的应用

    前言 我正在写FastGithub这个小麻雀项目,里面主要涉及了Pipeline模式和Factory+Provider模式,这两种设计模式,让这个项目在"ip扫描"和"i ...

  5. Service Provider模式

    参考文章:[http://blog.csdn.net/zl3450341/article/details/7227197] Service Interface:服务接口,将服务通过抽象统一声明,供客户 ...

  6. 从Membership 到 .NET4.5 之 ASP.NET Identity

    我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...

  7. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  8. 快速入门系列--MVC--04模型

    model元数据 闲来继续学习蒋金楠大师的ASP.NET MVC框架揭秘一书,当前主要阅读的内容是Model元数据的解析,即使是阅读完的现在,仍然有不少细节不是特别明白.好在这部分内容主要是关于Raz ...

  9. [转]Membership 到 .NET4.5 之 ASP.NET Identity

    本文转自:http://www.cnblogs.com/jesse2013/p/membership-part3.html 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然 ...

随机推荐

  1. [LigerUI]使用记录

    1. 下拉框设定 鼠标移开隐藏 但想改变下拉框大小时 很难一次定位到下拉框右下角那个点 2. ligerTab 自带标题菜单 但想修改成类似于 chrome 的标题菜单时 貌似没有找到方法 我用 ea ...

  2. Eclipse中配置Maven build打包

    Eclipse中配置Maven build打包 clean package

  3. Hive插入数据的几种常用方法

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  4. Asp.net 中高亮显示搜索关键字简单方法

    今天用到搜索时的高亮显示,百度了一下,如下面: 1.替换关键字,对字体变色.         public static string ReplaceRed(string strtitle, stri ...

  5. Electron 前端页面导入jQuery 出现错误Uncaught ReferenceError: jQuery is not defined

    如下: <script src="../assets/js/jquery-1.10.2.js"></script> 方法1 改为: <script&g ...

  6. fadora24安装settools,pip包出错解决方法

    1.fadora24安装Python2.7 [root@dev ~]# python bash: python: 未找到命令... 安装软件包“python”以提供命令“python”? [N/y] ...

  7. 【转】iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单

    近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装. 受此影响,当你的应用在 ...

  8. 使用libcurl显示下载进度

    使用libcurl显示下载进度 http://blog.csdn.net/zhouzhenhe2008/article/details/53876622

  9. java.util.ConcurrentModificationException异常分析

    Java在操作ArrayList.HashMap.TreeMap等容器类时,遇到了java.util.ConcurrentModificationException异常.以ArrayList为例,如下 ...

  10. ORA-01157:无法标识/锁定数据文件,ORA-01110:数据文件。。。