面试官:实现一个带值变更通知能力的Dictionary

简介: 上文中 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库今天本文就来实现一个带值变更通知能力的字典。

五毛钱的编程实践


关键字:变更 通知 字典


using System;
using System.Collections.Generic;
using System.Text;
namespace DAL
{
    public class ValueChangedEventArgs<TK> : EventArgs
    {
        public TK Key { get; set; }
        public ValueChangedEventArgs(TK key)
        {
            Key = key;
        }
    }
    public class DictionaryWapper<TKey, TValue>
    {
        public object  objLock = new object();
        private Dictionary<TKey, TValue> _dict;
        public event EventHandler<ValueChangedEventArgs<TKey>> OnValueChanged;
        public DictionaryWapper(Dictionary<TKey, TValue> dict)
        {
            _dict = dict;
        }
        public TValue this[TKey Key]
        {
            get { return _dict[Key]; }
            set
            {
                lock(objLock)
                {
                    try
                    {
                        if (_dict.ContainsKey(Key) && _dict[Key] != null && !_dict[Key].Equals(value))
                        {
                            OnValueChanged(this, new ValueChangedEventArgs<TKey>(Key));
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"检测值变更或者触发值变更事件,发生未知异常{ex}");
                    }
                    finally
                    {
                        _dict[Key] = value;
                    }
                }
            }
        }
    }
}


旁白:


1.定义值变更事件OnValueChanged 和变更时传递的事件参数ValueChangedEventArgs<TKey>


2.如何定义值变更,也就是如何判定值类型、引用类型的相等性#equalhashcode#


3.DictionaryWapper的表征实现也得益于C#索引器特性


订阅值变更事件


var _dictionaryWapper = new DictionaryWapper<string, string>(new Dictionary<string, string> { });
_dictionaryWapper.OnValueChanged += new EventHandler<ValueChangedEventArgs<string>>(OnConfigUsedChanged);
//----
public static void OnConfigUsedChanged(object sender, ValueChangedEventArgs<string> e)
{
   Console.WriteLine($"字典KEY:{e.Key}的值发生了变更,请注意...");          
}


最后像正常Dictionary一样为DictionaryWapper添加键值对:


_dictionaryWapper[$"{dbConfig}:{connectionConfig.Provider}"] = connection.ConnectionString;



五毛钱的结尾语


OK,本文实现了一个带值变更通知能力的字典,算是一个刚性需求。


通过本文,重温了C# event索引器的用法,基础不牢,地动山摇。

相关文章
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
169 5
|
9月前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
数据采集 Web App开发 测试技术
使用Selenium调试Edge浏览器的常见问题与解决方案
在互联网数据采集领域,Selenium常用于自动化网页爬取。针对使用Edge浏览器时遇到的启动远程调试失败、访问受限及代理IP设置等问题,本文提供了解决方案。通过特定命令启动Edge的远程调试模式,并利用Python脚本配合Selenium库,可实现代理IP、User-Agent的设定及Cookie管理等高级功能,有效提升爬虫稳定性和隐蔽性。遵循步骤配置后,即可顺畅执行自动化测试任务。
2416 1
使用Selenium调试Edge浏览器的常见问题与解决方案
|
Unix 数据处理 Perl
|
存储 Java 编译器
C 语言注释和变量详解
C语言中可以使用注释来解释代码并使其更具可读性。它还可以在测试替代代码时防止执行。
202 0
【验证小bai】soft constraint按域约束与整体约束的差异
【验证小bai】soft constraint按域约束与整体约束的差异
130 0
|
存储 SQL Prometheus
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
之前介绍了运维监控系统Prometheus,然后就有同鞋问我关于时序数据库的情况,所以这里总结一下时序数据库,并以InfluxDB为例,介绍时序数据库的功能特性和使用方式,希望能对大家有所帮助。
15757 4
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
|
关系型数据库 MySQL 数据库
[ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 1:备份.nb3文件方式)
本文主要讲解如何用Navicat(Navicat Premium ,或者Navicat for mysql)进行MySQL备份和恢复数据库。 本文主要大纲为:使用Navicat备份工具方式进行备份和还原,其中包括还原自身数据库和还原到其他目标库。
7381 0
[ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 1:备份.nb3文件方式)