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功能,然 ...
随机推荐
- 10-28质量监控ELK
监控业务范围 app崩溃监控(Bugly) 应用性能监控(APM) 业务监控(TalkingData.友盟) 质量监控(缺位) 质量监控平台ELK elk官网 数据构造 线上错误状态分布 故障影响范围 ...
- 分布式锁实践(二)-ZooKeeper实现总结
写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...
- js格式化时间 js格式化时间戳
一个js格式化时间和js格式化时间戳的例子. 代码:/** * 时间对象的格式化; */Date.prototype.format = function(format) { /* * eg:forma ...
- 「小程序JAVA实战」小程序数据缓存API(54)
转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushujuhuancunapi52/ 刚开始写小程序的时候,用户信息我 ...
- linux学习(别人指出来的), 回头有针对性的学下!
应该是 会linux 基本操作吧linux 安装 lamp lnmp php拓展这些基本都得会把知道subversion 和 github 这俩吧windows的代码同步到linux上无需ftp 会跟 ...
- Cardboard Talk02 Accelerometer
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Android studio 3.0.0 | Cardboard 1.0 在深入讨论具体实现之前,有必要了解一下Andro ...
- Mybatis多表查询(一对一、一对多、多对多)
Mybatis的多表级联查询 . 一对一可以通过<association>实现,一对多和多对多通过<collection>实现. <discriminator> 元 ...
- Educational Codeforces Round 54
这套题不难,但是场上数据水,导致有很多叉点 A. 因为是让求删掉一个后字典序最小,那么当a[i]>a[i+1]的时候,删掉a[i]一定最优!这个题有个叉点,当扫完一遍如果没有满足条件的,就删去最 ...
- maven下拉项目不能同步
maven下拉项目不能同步,如下图: 解决方法: 对项目右键,team, 选择这里 我选择第一项,有的需要根据情况选择第二项,如果点击完成后,还是不能同步代码,对项目右键,team,disconnec ...
- netbeans下调试php程序-xdebug
环境说明: pc系统:ubuntu 16.04 php版本:5.6.23 apache:Apache/2.4.18 (Ubuntu) 第一步:修改xdebug.ini 打开文件/etc/php/5.6 ...