c# - 如何在 .NET 中以 SOLID 方式实现库级跟踪和诊断?

标签 c# .net logging solid-principles

在创建专为在更大范围内重用而设计的企业库时,我经常发现自己因实现横切设计问题而陷入僵局,因为这些问题真的很难做到正确。今天,我坚持分析在可重用企业库中进行跟踪和诊断的最佳方式。

环顾 .NET 的 BCL,日志记录和诊断似乎是框架的一个重要部分。

  • System.Diagnostics 具有 Trace 系列类型,用于执行跟踪,并且具有 app.config 友好的采购和订阅(对于听众)。话虽如此,我一般来说倾向于讨厌 app.config,而是避免魔术配置字符串附带的松散类型的神秘。

  • System.Diagnostics.Tracing 具有 EventSource 类型系列,用于基于事件的诊断。这更符合我的类型,但我不清楚是否以及如何在库中使用它,因为日志记录策略是应用程序比域库更关心的问题。

一种对我来说有意义的可能性是在我的基础域库中简单地定义一些常见的日志记录接口(interface),并允许应用程序通过某种环境上下文模式注入(inject)实现,但为此定义我自己的日志记录类型似乎没有必要。

最佳答案

One possibility that makes sense to me is to simply define in my foundation domain library some common logging interfaces.

这是正确的。此外,您还必须创建一个默认记录器实现,该实现可能针对例如系统诊断跟踪类(如果此库的消费者应用程序打开了跟踪)。

allow applications to inject implementations via some sort of ambient context pattern

与其纠结于其他人将如何注入(inject)记录器,不如简单地提供一种方法,例如自定义工厂注入(inject)记录器接口(interface)的实现。

工厂将负责提供库中的实例。如果提供了实现,则使用该实现,否则默认实例应用作默认记录器。你可以看看EF7 library(logging)用于记录器的基础设施。

关于c# - 如何在 .NET 中以 SOLID 方式实现库级跟踪和诊断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033108/

相关文章:

c# - 如何使用 Javascript 更改 Gridview 中隐藏字段的值?

没有 .pdb 文件的 C# 分析失败

c# - 从旋转值的方向移动 Sprite ?

c# - 我应该考虑哪些日志门面?

java - 哪个 jar 文件包含 jersey LoggingFeature 类?

java - log4j2 中增强的 Throwable 渲染器

c# - 可以在泛型类型约束上指定它必须实现泛型类型吗?

c# - C# 中的 AbstractPreferences 等价物

具有延迟事件通知的 C# 作业队列实现

c# - MongoDB 获取服务器