为什么Database.Log不是事件?

时间:2014-07-12 17:26:01

标签: c# .net entity-framework

实体框架最近添加了使用Database.Log挂钩捕获SQL查询的功能。

让我感到惊讶的是,它并没有被实现为“受保护的封装友好装甲”代表,又称事件,而是作为一个裸多播代表

事实上,我见过EF团队成员这样做了:

context.Database.Log = sql => Debug.WriteLine(sql);

我期待的地方:

context.Database.Log += sql => Debug.WriteLine(sql);

以避免删除以前注册的处理程序。

此外,我们可以直接调用它:

context.Database.Log("SORRY SQL IS TOO MEDIEVAL FOR ME");

当然,这不是我期望做的事情。

这个选择背后是否存在一些理由,或者原始开发者错过了咖啡休息时间并忘记在提交之前添加event关键字。 ;)

编辑:突然之间我有一个非常可怕的疑问:作为一名.Net从业者和培训师,我“测量”了97%的.Net开发人员确信事件必须是EventHandler s,所以如果我正在审计一个“正常”的公司源代码,我会想:没关系,这家伙不知道它可以使用任何委托类型而且为了简单(我们只需要转移一个string)不希望使用EventHandler所以他认为他不能使用和事件,所以改为使用一个裸代理而不考虑封装“问题”。 但这将是一个“正常”的公司,我认为这是微软开发人员极不可能的......

1 个答案:

答案 0 :(得分:1)

这只是每个实例的日志记录,以防您很快想要为一个特定的DbContext实例创建输出,而不是为整个应用程序创建通用记录器。

如果您想记录所有内容并在应用程序级别设置它,那么您需要实现IDbCommandInterceptor

MSDN Article

您可以拥有任意数量的拦截器并同时使用dbContext.Database.Log