provider模式学习——simpledemo

2023-11-04

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按钮点击


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

provider模式学习——simpledemo 的相关文章

随机推荐

  • C语言_自定义数据类型

    目录 1 自定义数据类型 结构体 1 1 结构体类型的声明 1 1 1 匿名结构体 1 2 结构体的自引用 1 2 1 Typedef结构体重命名 1 3 结构体变量的定义和初始化 1 4 结构体内存对齐 1 4 1 结构体的对齐规则 1
  • 文件下载本地测试OK,部署到环境上报错,原因是jar包中不能通过this.getClass().getClassLoader().getResource(““).getFile()获取

    修改之前获取资源目录下的文件 但是后面定位发现当前jar包中的资源文件这种方式访问不到 打印出来的目录都是带 的 后面在网上各种找 结果看完后凉凉 后面想用getResourceAsStream读成流形式 但是下载下来打不开 开始以为是还是
  • 【送书活动】网络安全(黑客)自学

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • ffmpeg实战教程(四)格式转换如MP4转MKV等

    知识延伸 I P B帧和PTS DTS的关系 基本概念 I frame 帧内编码帧 又称intra picture I 帧通常是每个 GOP MPEG 所使用的一种视频压缩技术 的第一个帧 经过适度地压缩 做为随机访问的参考点 可以当成图象
  • 训练loss不下降原因集合

    11年it研发经验 从一个会计转行为算法工程师 学过C c java android php go js python CNN神经网络 四千多篇博文 三千多篇原创 只为与你分享 共同成长 一起进步 关注我 给你分享更多干货知识 目录 一 t
  • 人工智能发展现状

    作者 Chen Zhang 链接 https www zhihu com question 20102212 answer 126994210 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 随着深度学习技术
  • 数组的浅拷贝与深拷贝

    文章目录 1 数据类型 2 浅拷贝与深拷贝 3 实现深拷贝方法 3 1 JSON string 结合 JSON parse 3 2 递归 4 JS 中的拷贝方法 4 1 concat 4 2 slice 4 3 展开运算符 4 4 Obje
  • 函数栈帧的创建和销毁

    函数栈帧的创建和销毁 目录 一 困惑 二 详解 三 解惑 一 困惑 前期学习的时候 我们可能会有很多困惑 比如 局部变量是怎么创建的 为什么局部变量的值是随机值 函数是怎么传参的 传参的顺序是怎样的 形参和实参是什么关系 函数调用是怎么做的
  • MOT17数据集评估时遇到的一个错误:TypeError: __new__() got an unexpected keyword argument ‘labels‘

    在跑centertrack的test py的最后一步 对MOT17数据集评估这个部分遇到了一些bug 记录一下 问题1 找不到gt文件 解决方法 因为本地空间不够 所以我没把mot17数据集放在工程目录下直接在opt文件里面改的数据集目录
  • tx2安装onnx报错

    ERROR Failed building wheel for onnx Failed to build onnx ERROR Could not build wheels for onnx which is required to ins
  • 爬虫逆向(某财)

    在搜索中输入关键字 搜索 日期 涨 本文主要逆向的参数 代码实现 1 js部分 var aling this var document var window function n t function var r e a r e a n v
  • matlab使用教程(5)—矩阵定义和基本运算

    本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量 更广泛而言 数组为向量 矩阵或更高维度的数值网格 MATLAB 中的所有数组都是矩形 在这种意义上沿任何维度
  • Vue弹窗的使用与传值

    Vue弹窗的使用 Vue弹窗传值
  • 练习-Java继承和多态之super关键字

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 题目 练习 Java继承和多态之super关键字 任务 定义 Person 类和 Student 类 分别实现定义各自基本属性的功能 代码 Student java 定义 P
  • 6月3号绝地求生服务器维护,绝地求生6月3日维护到几点_2020年6月3日绝地求生更新维护开服时间介绍_咖绿茵手游站...

    绝地求生6月3日维护到几点呢 2020年6月3日绝地求生对正式服进行停机维护 接下来就让咖绿茵小编给大家带来 绝地求生 6月3日更新维护开服时间介绍 绝地求生 6月3日更新维护开服时间介绍 绝地求生在北京时间6月3日 星期三 08点30分开
  • 解决Flutter PageView页面切换时数据刷新问题

    首先补充一下 之前我没有写是在切换pageView页面的主页面写还是展示的子页面写 这里我说一下 一定要在切换的子页面里面使用这个方法 否则不生效 例如使用了PageView组件 每次切换页面时都会走initState 和dispose 方
  • TCP/IP详解 卷1:协议 学习笔记 第二十六章 Telnet和Rlogin:远程登录

    TCP IP网络上 有两种应用提供远程登录功能 1 Telnet 几乎每个TCP IP的实现都提供这个功能 它能够运行在不同操作系统的主机之间 Telnet通过客户进程和服务器进程之间的选项协商机制 从而确定通信双方可以提供的功能特性 2
  • [JAVA数据结构]HashMap

    目录 1 HashMap 1 1Map的常用方法 1 2HashMap的使用案例 1 HashMap 基于哈希表的实现的Map接口 Map底层结构 HashMap 底层结构 哈希桶 插入 删除 查找时间复杂度 O 1 是否有序 无序 线程安
  • 了解 z-index 层叠等级属性的使用

    当对多个元素同时设置定位时 定位元素之间有可能会发生重叠 接下来我会用代码来进行演示和讲解层叠的效果和使用 代码如下
  • provider模式学习——simpledemo

    1 首先建立一个类库项目 Provider Demo 添加如下类 并要添加引用System Configuration 1 1 创建ParentProvider类继承自provider的基类 namespace provider Provi