如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?今天我们聊这个刚性需求。

前文提要:

数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库。

上文中:DBA在为某个配置字符串切换新的连接信息时,SDK利用ClearPool(DBConnection conn)清空与这个连接相关的连接池。

清空的时机: 维护在用连接的字典键值发生变更。

今天本文就来实现一个带值变更通知能力的字典。

编程实践

关键字: 变更 通知 字典

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace DAL
  5. {
  6. public class ValueChangedEventArgs<TK> : EventArgs
  7. {
  8. public TK Key { get; set; }
  9. public ValueChangedEventArgs(TK key)
  10. {
  11. Key = key;
  12. }
  13. }
  14. public class DictionaryWapper<TKey, TValue>
  15. {
  16. public object objLock = new object();
  17. private Dictionary<TKey, TValue> _dict;
  18. public event EventHandler<ValueChangedEventArgs<TKey>> OnValueChanged;
  19. public DictionaryWapper(Dictionary<TKey, TValue> dict)
  20. {
  21. _dict = dict;
  22. }
  23. public TValue this[TKey Key]
  24. {
  25. get { return _dict[Key]; }
  26. set
  27. {
  28. lock(objLock)
  29. {
  30. try
  31. {
  32. if (_dict.ContainsKey(Key) && _dict[Key] != null && !_dict[Key].Equals(value))
  33. {
  34. OnValueChanged(this, new ValueChangedEventArgs<TKey>(Key));
  35. }
  36. }
  37. catch (Exception ex)
  38. {
  39. Console.WriteLine($"检测值变更或者触发值变更事件,发生未知异常{ex}");
  40. }
  41. finally
  42. {
  43. _dict[Key] = value;
  44. }
  45. }
  46. }
  47. }
  48. }
  49. }

旁白:

  1. 定义值变更事件OnValueChanged 和变更时传递的事件参数ValueChangedEventArgs<TKey>
  2. 如何定义值变更,也就是如何判定值类型、引用类型的相等性 #equalhashcode#
  3. DictionaryWapper的表征实现也得益于C#索引器特性
订阅值变更事件
  1. var _dictionaryWapper = new DictionaryWapper<string, string>(new Dictionary<string, string> { });
  2. _dictionaryWapper.OnValueChanged += new EventHandler<ValueChangedEventArgs<string>>(OnConfigUsedChanged);
  3. //----
  4. public static void OnConfigUsedChanged(object sender, ValueChangedEventArgs<string> e)
  5. {
  6. Console.WriteLine($"字典{e.Key}的值发生变更,请注意...");
  7. }

最后像正常Dictionary一样使用DictionaryWapper:

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

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

温习了 C# event 索引器的用法。

面试官:实现一个带值变更通知能力的Dictionary的更多相关文章

  1. 一张图,让你和面试官聊一个小时的“Java内存模型”

    如果面试官问你:你了解 Java 内存模型吗? 你就可以使用这张图,按照这张图中的顺序和面试官开聊,正常情况下,聊一个小时是差不多的,这个时候,对你的处境是非常有益的,因为面试官的时间不多了.

  2. 面试官:一个 TCP 连接可以发多少个 HTTP 请求?

      曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式 ...

  3. Sass--传一个带值的参数

    在 Sass 的混合宏中,还可以给混合宏的参数传一个默认值,例如: @mixin border-radius($radius: 3px) { -webkit-border-radius: $radiu ...

  4. 懵圈了,面试官问一个 TCP 连接可发多少个 HTTP 请求?

    作者:松若章 https://zhuanlan.zhihu.com/p/61423830 一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DO ...

  5. 面试官:一个TCP连接可以发多少个HTTP请求?

    曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式.什 ...

  6. 面试问烂的 MySQL 查询优化,看完屌打面试官!

    Java技术栈 ,一般把连接数设置得大一些). 并发量:同一时刻数据库服务器处理的请求数量 3.超高的 CPU使用率:CPU资源耗尽出现宕机. 4.磁盘 IO:磁盘 IO性能突然下降.大量消耗磁盘性能 ...

  7. 互联网公司的面试官是如何360°无死角考察候选人的?[z]

    [z]https://juejin.im/post/5c0e47ebf265da614e2be9a7 一.写在前面 最近收到不少读者反馈,说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不 ...

  8. 攻略前端面试官(一):JS的数据类型和内存机制浅析

    原文地址:http://rainykane.cn/2019/09/29/与K_K君一起攻略前端面试官(一):JS的数据类型和内存机制浅析/ 背就完事了 介绍:一些知识点相关的面试题和答案 使用姿势:看 ...

  9. 【Spring注解驱动开发】面试官:如何将Service注入到Servlet中?朋友又栽了!!

    写在前面 最近,一位读者出去面试前准备了很久,信心满满的去面试.没想到面试官的一个问题把他难住了.面试官的问题是这样的:如何使用Spring将Service注入到Servlet中呢?这位读者平时也是很 ...

随机推荐

  1. UI自动化学习笔记- Selenium元素定位及元素操作

    一.元素定位 1. 如何进行元素定位? 元素定位就是通过元素的信息或元素层级结构来定位元素的 2.定位工具 浏览器开发者工具 3.元素定位方式 Selenium提供了八种定位元素方式 id name ...

  2. 13.6Comparable接口

    要点提示:Comparable接口定义了conpareTo方法,用于比较对象. public interface Comparable<E>{ piblic int compareTo(E ...

  3. 查看JVM中的线程名

    实例说明 在Java虚拟机中(JVM):除了用户创建的线程,还有服务于用户线程的其他线程.它们根据不同的用途被分到不同的组中进行管理.本实例将演示JVM中线程的名字及其所在组的名称. 关键技术 线程组 ...

  4. MySQL不支持DELETE使用表别名?

    最近做的需求经常和数据库在打交道, 因为系统页面上某些展示的字段并不是在前端写死的, 而是配置在数据库中, 这样的话便于维护和扩展. 于是遇到了一个MySQL中比较细节性的问题. 日常开发中不少程序员 ...

  5. 关于HTML的常用标签

    目录 前言 html常用标签 排版标签 图像标签 链接标签 注释标签 预格式化文本pre标签&特殊字符 语义化标签 前言 本文主要是对html的常用标签一个总结归纳,对所学的内容做一个查漏补缺 ...

  6. CentOS-常用命令(版本:7.x)

    常用命令 注:centos命令不定期持续更新,希望能够帮到你~ 修改主机名 $ hostnamectl set-hostname xxx 查看IP $ vim /etc/sysconfig/netwo ...

  7. Hibernate框架(三)框架中的关系映射

    在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系.而Hibernate时间实体类和数据库中的表进行的映射, ...

  8. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  9. c++中的继承关系

    1 什么是继承 面向对象的继承关系指类之间的父子关系.用类图表示如下: 2 为什么要有继承?/ 继承的意义? 因为继承是面向对象中代码复用的一种手段.通过继承,可以获取父类的所有功能,也可以在子类中重 ...

  10. python3安装pp过程

    并行计算的目的是将所有的核心都运行起来以提高代码的执行速度,在python中由于存在全局解释器锁(GIL)如果使用默认的python多线程进行并行计算可能会发现代码的执行速度并不会加快,甚至会比使用但 ...