您的位置:首页 > 其它

provider模式学习——simpledemo

2015-04-15 19:05 204 查看

1.首先建立一个类库项目:Provider Demo,添加如下类:并要添加引用System.Configuration

1.1 创建ParentProvider类继承自provider的基类:

namespace provider.Provider
{
public abstract class ParentProvider : ProviderBase
{
public abstract string ShowData();
}
}

1.2 创建ParentProviderCollection类继承自ProviderCollection基类

namespace provider.Provider
{
/// <summary>
/// 该类用于管理provider的集合
/// </summary>
public class ParentProviderCollection : ProviderCollection
{
/// <summary>
/// 获取指定名称的provider,从几何中获得名称为name的provider
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public new ParentProvider this[string name]
{
get { return (ParentProvider)base[name]; }
}
/// <summary>
/// 重写基类中添加provider到集合的方法
/// </summary>
/// <param name="provider"></param>
public override void Add(ProviderBase provider)
{
if (provider == null)
throw new ArgumentNullException("Provider");
if (!(provider is ParentProvider))
throw new ArgumentException("Invalid provider type", "provider");
base.Add(provider);
}
}
}

1.3创建ParentProviderConfigurationSection类继承自ConfigurationSection

namespace provider.Provider
{
/// <summary>
/// 这个类可以看成是一个管理配置文件中节点的类,
/// 这个类中属性使用Attribute的方式声明值,具体里面的值可以通过反射得到
/// </summary>
public class ParentProviderConfigurationSection : ConfigurationSection
{
/// <summary>
/// 获取配置文件中配置节名称为Providers的信息
/// </summary>
[ConfigurationProperty("providers")]
public ProviderSettingsCollection Providers
{
get { return (ProviderSettingsCollection)base["providers"]; }
}
//[StringValidator(MinLength=1)]
[ConfigurationProperty("defaultProvider")]
public string DefaultProvider
{
get { return (string)base["defaultProvider"];}
set { base["defaultProvider"]=value;}
}
}
}

1.4创建ChineseProvider继承自ParentProvider

namespace provider.Provider
{
public class ChineseProvider:ParentProvider
{
public override string ShowData()
{
return "你好,欢迎来到中国";
}
}
}

1.5创建EnglishProvider继承自ParentProvider

namespace provider.Provider
{
public  class EnglishProvider:ParentProvider
{
public override string ShowData()
{
return "hello ,welcome to china";
}
}
}

2.编译该类库项目生成程序集文件

3.新建c#窗体项目

3.1 添加providerDemo.dll的引用

3.2 添加引用System.Configuration

3.3 修改配置文件
<configuration>
<configSections>
<section name ="parentProvider" type ="provider.Provider.ParentProviderConfigurationSection,providerDemo"/>
</configSections>
<parentProvider defaultProvider="ChineseProvider">
<providers>
<add name="ChineseProvider" type="provider.Provider.ChineseProvider"/>
<add name="EnglishProvider" type="provider.Provider.EnglishProvider"/>
</providers>
</parentProvider>
</configuration>
3.4 主窗体事件响应代码

public partial class Form1 : Form
{
private ParentProvider provider;
private ParentProviderCollection providerCollection;
public Form1()
{
InitializeComponent();
}

private void btnC_Click(object sender, EventArgs e)
{
LoadProvider("ChineseProvider");
txtDisplay.Text = provider.ShowData();
}

private void btnE_Click(object sender, EventArgs e)
{
LoadProvider("EnglishProvider");
txtDisplay.Text = provider.ShowData();
}

private void Form1_Load(object sender, EventArgs e)
{
LoadProvider(null);
txtDisplay.Text = provider.ShowData();
}
private void LoadProvider(string providerSelected)
{
ParentProviderConfigurationSection config = null;
config = (ParentProviderConfigurationSection)ConfigurationManager.GetSection("parentProvider");
providerCollection = new ParentProviderCollection();
ProviderHelper.InstantiateProviders(config.Providers, providerCollection, typeof(ParentProvider));
provider = providerCollection[providerSelected ?? config.DefaultProvider];
}
}

4.运行结果展示

4.1 窗体加载:(使用默认的provider)

4.2 English按钮点击



4.3 Chinese按钮点击

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: