Provider 模式
2024-09-04 11:03:05
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
最新文章
- linux安装nexus
- ireport5.6+jasperreport6.3开发(四)--以javabean为基准的报表开发(ireport)
- Ubuntu 16.04 标题栏实时显示上下行网速、CPU及内存使用率--indicator-sysmonitor
- CSS3中的2D转换
- linux 下tomcat catalina.out日志操作
- 小知识:如何解压cpio.gz文件
- list::splice()函数详解
- Mac操作系统常用快捷键
- axure RP Pro7.0加载日历控件的步骤
- php生成短网址的思路与方法
- 第3章 Java语言基础----声明成员变量,对变量进行赋值
- python3.5 + django1.9.1+mysql
- java之日志管理
- C#学习-接口
- 性能测试进阶指南——基础篇之磁盘IO
- Java 并发编程-NIO 简明教程
- mathML如何在谷歌浏览器进行展示
- MySQL 分支和循环结构
- Python学习笔记第二十四周(JavaScript补充)
- SpringBoot整合EHcache学习笔记
热门文章
- 折腾一天,获取下列多选框的所有选中值,原生js可直接通过obj.val()来获取,可jq不行,要通过循环取值来获取;
- 关于oracle数据库启动报ORA-01122,ORA-01110,ORA-01203错误的解决方法
- TNS-12535: TNS:operation timed out、TNS-00505: Operation timed out
- 给iOS开发新手送点福利,简述UISlide的属性和用法
- springboot 邮件服务
- 全面解析python类的绑定方法与非绑定方法
- Spring启动时获取自定义注解的属性值
- 开源地理空间基金会OSGeo简介
- Git进阶--你可能不知道的很好用Git功能
- BashProfile