Provider 模式
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 模式的更多相关文章
- ASP.NET Provider模式应用之SqlMembershipProvider类的剖析
太多了,先给个流程图吧 Provider模式就是GOF中的两种设计模式的应用:策略模式和工厂模式,在程序中使用好这个模型能够解除模块与模块之间的耦合甚至是DIP,同时,不管是ASP.NET MVC还是 ...
- provider模式
最近看代码有所感想吧.当底层API,发生变化时,可以使用Provider模式.既然是模式就一定的股则. 1.该模式对原有接口的封装. 2.该模式实现对API的封装,不显示细节,从而取消依赖关系. 3. ...
- Provider模式应用demo
参考ObjectPool对象池设计原理还原一个简易的Provider模式. using System; using System.Dynamic; using System.Reflection.Me ...
- Pipeline模式与Factory+Provider模式的应用
前言 我正在写FastGithub这个小麻雀项目,里面主要涉及了Pipeline模式和Factory+Provider模式,这两种设计模式,让这个项目在"ip扫描"和"i ...
- Service Provider模式
参考文章:[http://blog.csdn.net/zl3450341/article/details/7227197] Service Interface:服务接口,将服务通过抽象统一声明,供客户 ...
- 从Membership 到 .NET4.5 之 ASP.NET Identity
我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...
- YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)
程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...
- 快速入门系列--MVC--04模型
model元数据 闲来继续学习蒋金楠大师的ASP.NET MVC框架揭秘一书,当前主要阅读的内容是Model元数据的解析,即使是阅读完的现在,仍然有不少细节不是特别明白.好在这部分内容主要是关于Raz ...
- [转]Membership 到 .NET4.5 之 ASP.NET Identity
本文转自:http://www.cnblogs.com/jesse2013/p/membership-part3.html 我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然 ...
随机推荐
- Django 组件content_type
content type: django内置组件,这个组件帮忙做连表操作(混搭连表) 适用场景:适用于一张表与多张表同时做关联的时候.直接导入就可以使用了. 关联数据库所有的表:可以快速插入数据,并且 ...
- java web 程序---注册页面核心代码哈希Map
收获:在运行程序的时候,错误出现.主要是map没有进行判断,是否为空,如果为空,则创建一个对象new HashMap(); 然后就注意细节, String name=request.getParame ...
- jsp---猜数字游戏,深有感触
猜数字游戏注意两点.1.随机数和猜的数字不能放在同一个页面,不然随机数不停出现,猜的数字不可能相等的. 2.数据类型的相互转换.包装类Integer和int的用法,前者是类,后者是基本数据类型 cai ...
- windows8.1中组件服务DCOM配置里属性灰色不可修改的解决办法
由于电脑升级,更换成了windows8.1的64位操作系统,今天遇到组件服务中DCOM配置里IIS Admin Service属性呈现灰色,不能修改. 查找官方文档,原来这是win8.1 x64的安全 ...
- servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)
首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...
- C# mysql 连接Apache Doris
前提: 安装mysql odbc驱动程序,目前只不支持8.0的最新版本驱动,个人使用的是5.1.12的驱动(不支持5.2以上版本),下载地址为: x64: https://cdn.mysql.com ...
- 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 ...
- lamp。查看版本
[root@localhost ~]# php -vPHP 5.2.16 (cli) (built: Dec 17 2010 14:09:03) Copyright (c) 1997-2010 The ...
- Microsoft Office Professional Plus 2013全套
Microsoft Office Professional Plus 2013全套产品,全激活版本 包括Access Word Excel Powerpoint Publisher Skyd ...
- MVC-READ1
将具有不同稳定性的元素融为一体,具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设计中的体现. MVC的创建者是Trygve M. H. Reenskau,他是挪威的计算机专家,同时也是 ...