<分区>
Entity Framework 最近添加了使用 Database.Log
Hook 捕获 SQL 查询的功能。
令我惊讶的是,它不是作为“ protected 封装友好型装甲”委托(delegate)(又名事件)实现的,而是作为一个裸露的多播委托(delegate).
事实上,我已经看到 EF 团队的成员这样做了:
context.Database.Log = sql => Debug.WriteLine(sql);
我期望的地方:
context.Database.Log += sql => Debug.WriteLine(sql);
避免删除以前注册的处理程序。
此外,我们可以直接调用裸委托(delegate):
context.Database.Log("SORRY SQL IS TOO MEDIEVAL FOR ME");
这当然不是我希望做的事情。
这个选择背后是否有一些理由,或者原始开发人员错过了休息时间,忘记在提交之前添加 event
关键字。 ;)
编辑:突然间,我有一个非常可怕的怀疑:作为一名 .Net 从业者和培训师,我“测量”了 97% 的 .Net 开发人员确信事件必须是 EventHandler
s,所以如果我正在审计一个“正常”的公司源代码,我会想:没关系,这个人不知道它可以使用任何委托(delegate)类型并且为了简单起见(我们只需要传输一个 string
) 不想使用 EventHandler
所以他认为他不能使用和事件所以而不是使用一个裸委托(delegate)而不考虑封装“问题”。
但这适用于一家“普通”公司,我认为微软开发人员不太可能...