面试官:实现一个带值变更通知能力的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索引器的用法,基础不牢,地动山摇。

相关文章
|
2月前
|
消息中间件 存储 分布式计算
大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
37 4
|
4月前
|
负载均衡
异步任务处理系统问题之任务去重机制工作的问题如何解决
异步任务处理系统问题之任务去重机制工作的问题如何解决
|
4月前
|
消息中间件 存储 Shell
就软件研发问题之使用mqadmin工具拷贝授权信息到新Broker的问题如何解决
就软件研发问题之使用mqadmin工具拷贝授权信息到新Broker的问题如何解决
|
6月前
|
运维 Kubernetes Devops
阿里云云效操作报错合集之Message: code: 403, 当前代码组下无法创建可见性为企业可见的代码库,该如何处理
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
5月前
|
中间件 Java 数据库连接
开发与运维应用问题之异步初始化bean风险如何解决
开发与运维应用问题之异步初始化bean风险如何解决
|
6月前
|
算法 前端开发 Java
Bug复盘:接口异步返回的重要性
Bug复盘:接口异步返回的重要性
|
7月前
|
消息中间件 架构师 NoSQL
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
我们在美团 APP 下单,假如没有立即支付,进入订单详情会显示倒计时,如果超过支付时间,订单就会被自动取消。 这篇文章,笔者想以架构师的视角,深入剖析如何设计订单超时自动取消的功能。
以架构师的视角,深入剖析如何设计订单超时自动取消的功能
|
7月前
|
Java 数据库连接 API
对象变更记录objectlog工具(持续跟新)
记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包,以非侵入方式实现对标记的对象属性进行记录,仅需要导入依赖即可,几乎不需要对原系统代码改动.
|
7月前
|
算法 Java 程序员
技术更新迭代与“八股文”知识库的清理与更新
随着互联网技术的不断更新迭代,曾经被认为是“标准答案”的观点和方法已经逐渐失去适应当前需求的能力,甚至被视为过时的做法。就拿最近的技术圈新闻来讲,在新的JDK版本中,Java编程引入了许多新的特性、工具和方法,使其变得更加简洁、高效和强大,但是之前的旧特性和方法也有许多被废弃了,比如曾经比较经典的偏向锁已经被废弃了,因此,个人觉得是时候对“八股文”进行一次知识库的清理和更新了。那么本文就来分享一下关于偏向锁被废弃以及个人对此的看法,并回顾一下自己的“八股文”知识库,以及技术更新迭代地时候我们要保持及时更新自己的知识储备。
118 2
技术更新迭代与“八股文”知识库的清理与更新
|
7月前
测试沟通不畅时该如何解决?
测试沟通不畅时该如何解决?
194 0