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

前文提要:

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

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

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

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

编程实践

关键字: 变更 通知 字典

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($"字典{e.Key}的值发生变更,请注意...");
}

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

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

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

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

最新文章

  1. 浅谈web网站架构演变过程
  2. caffe的python接口学习(8):caffemodel中的参数及特征的抽取
  3. 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
  4. Excel动态合并行、合并列
  5. Linux Purify命令
  6. Java--&gt;在txt文件每一行前加行数和冒号
  7. 16款最佳HTML5超酷动画演示及源码
  8. [React Testing] Setting up dependencies &amp;&amp; Running tests
  9. PKIX path building failed
  10. 用Python来找合适的妹子
  11. js 数组去重复两种方法一看就懂
  12. TeamViewer试用期满转免费版本方法
  13. MassTransit 学习
  14. 【6集iCore3_ADP触摸屏驱动讲解视频】6-3 底层驱动之液晶显示
  15. Linux网路查看工具
  16. 007 jquery过滤选择器-----------(屬性过滤选择器)
  17. GET POST方法长度限制(转)
  18. Linear Regression Using Gradient Descent 代码实现
  19. 单点登录(十八)----cas4.2.x客户端增加权限控制shiro
  20. HDUOJ----(1016)Prime Ring Problem

热门文章

  1. k8s部署docker容器
  2. 在docker中使用nginx部署前端项目
  3. 保存TextBox中的文字为Path功能
  4. Spring boot+Mybatis+MySQL插入中文乱码
  5. tomcat隐藏版本信息防止人为扫描特定版本漏洞攻击服务器
  6. [刘阳Java]_Spring IoC原理_第2讲
  7. java网络编程基础——TCP网络编程三
  8. Http协议知识点回顾
  9. windows程序快速启动的方式:WIN键+R
  10. 5Java基础整理