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功能,然 ...
随机推荐
- mysql master or master copy
双主复制: 在两台server配置my.cnf [root@localhost mysql]# egrep -v "^$|^#" /etc/my.cnf datadir = /my ...
- python 下载图片的方法
a='http://wx1.sinaimg.cn/mw600/006HOayNgy1fqjdi2nxohj32pw3o8x6s.jpg' #图片下载地址 ( 这里改成 文件txt地址)w='/U ...
- Bootstrap-CL:分页
ylbtech-Bootstrap-CL:分页 1.返回顶部 1. Bootstrap 分页 本章将讲解 Bootstrap 支持的分页特性.分页(Pagination),是一种无序列表,Bootst ...
- 利用PHP实现页面跳转同时POST传参,CURL不行
function payto(){ echo "<form style='display:none;' id='form1' name='form1' method='post' ac ...
- 替换res\drawable中的图片
现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是 ...
- Spring batch学习 (1)
Spring Batch 批处理框架 埃森哲和Spring Source研发 主要解决批处理数据的问题,包含并行处理,事务处理机制等.具有健壮性 可扩展,和自带的监控功能,并且支持断点和重发.让程序员 ...
- jdk1.6 eclipse kepler 中安装jda
原因这是个比较老的版本的jad 参考:https://www.cnblogs.com/zhikou/p/8098137.html 1.在eclipse的help—>Install New Sof ...
- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path问题的解决
这个问题的解决有二种解决办法: 1.加apache tomcat的运行环境即可 选中项目点击右键 以上这种做法是在eclipse中的做法 2.如果是maven工程,还可以采用maven做法 就在这个工 ...
- 无法启动Tomcat, 端口被占用的问题
这个错误是说这几个端口已经有某个应用程序占用了,所以Tomcat就没法启动了. 出现这个问题的原因可能有以下几种: 情况一:点击运行的时候没有选中页面或Servlet窗口的标签 标签被选中时: 标 ...
- redis在Web中的使用
redis是一个键值对数据库,用于缓存数据. redis是一个key-value存储系统.和Memcached数据库类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...