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

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

以发邮件为例:

Email Provider Config:

  1. public abstract class EmailProvider : ProviderBase
  2. {
  3. #region Public Methods and Operators
  4.  
  5. public abstract EmailResponse SendEmail(ApiSetting apiSetting, EmailContent content);
  6.  
  7. #endregion
  8. }
  9.  
  10. public sealed class EmailProviderCollection : ProviderCollection
  11. {
  12. #region Public Indexers
  13.  
  14. public new EmailProvider this[string name]
  15. {
  16. get { return (EmailProvider) base[name]; }
  17. }
  18.  
  19. #endregion
  20. }
  21.  
  22. public sealed class EmailProviderConfiguration : ConfigurationSection
  23. {
  24. #region Public Properties
  25.  
  26. /// <summary>
  27. /// Gets the default provider name.
  28. /// </summary>
  29. [ConfigurationProperty("default", DefaultValue = "EDMProvider")]
  30. public string DefaultProviderName
  31. {
  32. get { return base["default"] as string; }
  33. }
  34.  
  35. /// <summary>
  36. /// Gets the providers.
  37. /// </summary>
  38. [ConfigurationProperty("providers")]
  39. public ProviderSettingsCollection Providers
  40. {
  41. get { return (ProviderSettingsCollection) base["providers"]; }
  42. }
  43.  
  44. #endregion
  45. }
  46.  
  47. public static class EmailProviderManager
  48. {
  49. #region Static Fields
  50.  
  51. private static readonly EmailProviderCollection Providers = new EmailProviderCollection();
  52.  
  53. #endregion
  54.  
  55. #region Constructors and Destructors
  56.  
  57. /// <summary>
  58. /// Initializes static members of the <see cref="EmailProviderConfiguration" /> class.
  59. /// </summary>
  60. static EmailProviderManager()
  61. {
  62. Initialize();
  63. }
  64.  
  65. #endregion
  66.  
  67. #region Public Properties
  68.  
  69. /// <summary>
  70. /// Gets the default.
  71. /// </summary>
  72. public static EmailProvider EmailProvider { get; private set; }
  73.  
  74. #endregion
  75.  
  76. #region Methods
  77.  
  78. /// <summary>
  79. /// Reads the configuration related to the set of configured
  80. /// providers and sets the default and collection of providers and settings.
  81. /// </summary>
  82. private static void Initialize()
  83. {
  84. try
  85. {
  86. var section = (EmailProviderConfiguration) ConfigurationManager.GetSection("EmailProviders");
  87.  
  88. if (section == null)
  89. {
  90. throw new ConfigurationErrorsException("Email Provider Section is not set");
  91. }
  92.  
  93. ProvidersHelper.InstantiateProviders(section.Providers, Providers, typeof (EmailProvider));
  94.  
  95. if (Providers[section.DefaultProviderName] == null)
  96. {
  97. throw new ConfigurationErrorsException("Email provider is not set");
  98. }
  99.  
  100. EmailProvider = Providers[section.DefaultProviderName];
  101. }
  102. catch (Exception ex)
  103. {
  104. Log.Debug(ex.Message, ex);
  105. }
  106. }

EDMProvider

  1. public sealed class EDMProvider : EmailProvider
  2. {
  3. #region Public Methods and Operators
  4.  
  5. public override EmailResponse SendEmail(ApiSetting apiSetting, EmailContent content)
  6. {
  7. 。。。。
  8. }
  9. }

Configuration:

  1. <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  2.  
  3. <configSections>
  4. <section name="EmailProviders" type="AAA.Mail.Configuration.EmailProviderConfiguration, AAA.Mail" />
  5. </configSections>
  6.  
  7. <EmailProviders default="EDMProvider">
  8. <providers>
  9. <add name="EDMProvider" type="AAA.Mail.EDM.EDMProvider, AAA.Mail.EDM" />
  10. </providers>
  11. </EmailProviders>
  12.  
  13. </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. Django 组件content_type

    content type: django内置组件,这个组件帮忙做连表操作(混搭连表) 适用场景:适用于一张表与多张表同时做关联的时候.直接导入就可以使用了. 关联数据库所有的表:可以快速插入数据,并且 ...

  2. java web 程序---注册页面核心代码哈希Map

    收获:在运行程序的时候,错误出现.主要是map没有进行判断,是否为空,如果为空,则创建一个对象new HashMap(); 然后就注意细节, String name=request.getParame ...

  3. jsp---猜数字游戏,深有感触

    猜数字游戏注意两点.1.随机数和猜的数字不能放在同一个页面,不然随机数不停出现,猜的数字不可能相等的. 2.数据类型的相互转换.包装类Integer和int的用法,前者是类,后者是基本数据类型 cai ...

  4. windows8.1中组件服务DCOM配置里属性灰色不可修改的解决办法

    由于电脑升级,更换成了windows8.1的64位操作系统,今天遇到组件服务中DCOM配置里IIS Admin Service属性呈现灰色,不能修改. 查找官方文档,原来这是win8.1 x64的安全 ...

  5. servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)

    首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...

  6. C# mysql 连接Apache Doris

    前提:  安装mysql odbc驱动程序,目前只不支持8.0的最新版本驱动,个人使用的是5.1.12的驱动(不支持5.2以上版本),下载地址为: x64: https://cdn.mysql.com ...

  7. ggplot2 texts : Add text annotations to a graph in R software

    http://www.sthda.com/english/wiki/ggplot2-texts-add-text-annotations-to-a-graph-in-r-software Instal ...

  8. lamp。查看版本

    [root@localhost ~]# php -vPHP 5.2.16 (cli) (built: Dec 17 2010 14:09:03) Copyright (c) 1997-2010 The ...

  9. Microsoft Office Professional Plus 2013全套

    Microsoft Office Professional Plus 2013全套产品,全激活版本 包括Access  Word  Excel  Powerpoint  Publisher  Skyd ...

  10. MVC-READ1

    将具有不同稳定性的元素融为一体,具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设计中的体现. MVC的创建者是Trygve M. H. Reenskau,他是挪威的计算机专家,同时也是 ...