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

最新文章

  1. linux安装nexus
  2. ireport5.6+jasperreport6.3开发(四)--以javabean为基准的报表开发(ireport)
  3. Ubuntu 16.04 标题栏实时显示上下行网速、CPU及内存使用率--indicator-sysmonitor
  4. CSS3中的2D转换
  5. linux 下tomcat catalina.out日志操作
  6. 小知识:如何解压cpio.gz文件
  7. list::splice()函数详解
  8. Mac操作系统常用快捷键
  9. axure RP Pro7.0加载日历控件的步骤
  10. php生成短网址的思路与方法
  11. 第3章 Java语言基础----声明成员变量,对变量进行赋值
  12. python3.5 + django1.9.1+mysql
  13. java之日志管理
  14. C#学习-接口
  15. 性能测试进阶指南——基础篇之磁盘IO
  16. Java 并发编程-NIO 简明教程
  17. mathML如何在谷歌浏览器进行展示
  18. MySQL 分支和循环结构
  19. Python学习笔记第二十四周(JavaScript补充)
  20. SpringBoot整合EHcache学习笔记

热门文章

  1. 折腾一天,获取下列多选框的所有选中值,原生js可直接通过obj.val()来获取,可jq不行,要通过循环取值来获取;
  2. 关于oracle数据库启动报ORA-01122,ORA-01110,ORA-01203错误的解决方法
  3. TNS-12535: TNS:operation timed out、TNS-00505: Operation timed out
  4. 给iOS开发新手送点福利,简述UISlide的属性和用法
  5. springboot 邮件服务
  6. 全面解析python类的绑定方法与非绑定方法
  7. Spring启动时获取自定义注解的属性值
  8. 开源地理空间基金会OSGeo简介
  9. Git进阶--你可能不知道的很好用Git功能
  10. BashProfile