.net中的Provider模式

2008年09月23日  |  9:19 下午分类:Develop  |  标签:  |  

自.net 2.0出世时,Provider模式就随处可见了,如:MembershipProvider、SiteMapProvider等,
它的出现使我们的应用程序有了更大的扩展性,可以是一个数据工厂的提供者,也可以是一个逻辑处理的提供者。
而实现这种模式却是相当的简单,只需实现以下四步即可:
1、定义一个类,抽象出我们所需要的操作,基类为ProviderBase
如:

public abstract class RssProvider : ProviderBase
{
public abstract void LoadRss();
public abstract void AddRss();
}

2、实现一个Section,用来从配置文件中读取Provider的相关配置,该类继承于ConfigurationSection

public class RssProviderSection : ConfigurationSection
{
[ConfigurationProperty("providers")]
public ProviderSettingsCollection Providers
{
get { return (ProviderSettingsCollection)base["providers"]; }
set { base["providers"] = value; }
}

[StringValidator(MinLength=1)]
[ConfigurationProperty("defaultProvider", DefaultValue = "XmlProvider")]
public string DefaultProvider
{
get { return (string)base["defaultProvider"]; }
set { base["defaultProvider"] = value; }
}
}
public class RssProviderCollection : ProviderCollection
{
//从索引器中获取指定名称的Provider
public new RssProvider this[string name]
{
get
{
return (RssProvider)base[name];
}
}

public override void Add(ProviderBase provider)
{
if (provider == null)
{
throw new ArgumentNullException("provider");
}
if (provider is RssProvider)
{
base.Add(provider);
}
}
}

3、在调用时用RssProviderSection去读取配置文件,并加载指定的Provider

public class RssService
{
private static RssProvider _provider;
private static RssProviderCollection _providers;
private static readonly object obj = new object();
public static RssProvider Provider
{
get
{
LoadProvider();
return _provider;
}
}
public static RssProviderCollection Providers
{

get {
LoadProvider();
return _providers; }
}

public static void LoadProvider()
{
if (_provider == null)
{
lock (obj)
{
if (_provider == null)
{
RssProviderSection section = (BlogProviderSection)System.Configuration.ConfigurationManager.GetSection("Blog/RssService");
_providers = new RssProviderCollection();
ProvidersHelper.InstantiateProviders(section.Providers, _providers, typeof(BlogProvider));
_provider = _providers[section.DefaultProvider];
if (_provider == null)
throw new ProviderException("null");
}
}
}
}
}

4、配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="Blog">
<section name="RssService" type="ClassLib.BlogProviderSection,ClassLib"/>
</sectionGroup>
</configSections>
<Blog>
<RssService defaultProvider="XmlProvider">
<providers>
<add name="XmlProvider" type="ClassLib.XmlProvider,ClassLib"></add>
<add name="SqlProvider" type="ClassLib.SqlProvider,ClassLib"></add>
</providers>
</RssService>
</Blog>
</configuration>

更多内容可以去MSDN查阅ProviderBase基类

转载时务必以超链接形式标明文章原始出处和作者信息。

2 位领导已批示 关于 “.net中的Provider模式”

  1. vecoe 发表于: 九月 25th, 2008 2:49 下午

    看来我要大补了

  2. JoeRadlorama 发表于: 十二月 6th, 2008 11:40 上午

    我靠,看不懂了啊


发表您的评论

1410168172122013183195114157619