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

相关文章
|
5月前
|
API 数据安全/隐私保护 开发者
【优秀程序设计】【good-practice】聚合系统如何实现通道侧回调的业务结果通知?
【8月更文挑战第3天】本文介绍了公司短信平台聚合系统中,短信通道回调的业务处理方法。文章详细描述了如何通过统一回调接口与合理分层设计优化代码结构,避免烟囱式代码堆砌,提高扩展性和维护性。
62 2
|
7月前
|
算法 前端开发 Java
Bug复盘:接口异步返回的重要性
Bug复盘:接口异步返回的重要性
|
8月前
|
Java 数据库连接 API
对象变更记录objectlog工具(持续跟新)
记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包,以非侵入方式实现对标记的对象属性进行记录,仅需要导入依赖即可,几乎不需要对原系统代码改动.
|
Kubernetes NoSQL Redis
我是如何用 redis 分布式锁来解决线上历史业务问题的
我是如何用 redis 分布式锁来解决线上历史业务问题的
|
8月前
|
资源调度 监控 项目管理
第十六章变更管理(选择1分)
第十六章变更管理(选择1分)
|
存储 关系型数据库 MySQL
面试常见问题-接口怎么做的幂等
面试常见问题-接口怎么做的幂等
126 0
|
存储 算法 Java
String最大长度是多少?涉及知识面太多,不要错过!
String最大长度是多少?涉及知识面太多,不要错过!
325 0
String最大长度是多少?涉及知识面太多,不要错过!
|
数据处理 调度 数据库
Elastic-Job任务错过机制(misfire)与幂等机制(monitorExecution)
Elastic-Job任务错过机制(misfire)与幂等机制(monitorExecution)
|
监控 数据库
zabbix告警持续频繁发送历史消息解决方法
zabbix持续频繁的发送历史的告警消息,一晚上告警内容高达1.7w条,严重影响查看真正出现问题的告警信息。 产生此问题的原因: 告警消息积压堆积,一直处于重试状态。 触发器的确存在,但是目标监控主机的状态是正常的,只要触发器触发的问题存在,那么就会一直发生告警。
1180 0
|
消息中间件 存储 NoSQL
消息幂等(去重)通用解决方案,写得真好!
消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢失,即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件最基本的特性之一,也就是我们常说的“AT LEAST ONCE”,即消息至少会被“成功消费一遍”。