c# - 日志记录类应该作为依赖项插入还是应该使用静态方法

标签 c# oop design-patterns

我知道日志记录是一个跨领域的问题,我通常使用 AOP 来记录任何错误或异常。然而,我面临着这样一种情况,我们还必须记录有关所执行的各种操作的特定信息,例如,当操作成功时,我们也必须记录该信息,如果来自 Web 服务的响应无效,我们还必须记录一些内容这意味着在某些情况下,记录事件成为业务流程的特定部分,并且在这些特定情况下,它不是一个跨领域的问题。

为了处理这种情况,我创建了一个 DBLogger 类,它只是将一些动态消息和错误代码写入数据库。

目前我正在通过 ILogger 接口(interface)的依赖注入(inject)使用 DBLogger 类。当我查看代码时,我发现我在需要记录业务规则违规的每个类中注入(inject)了此类,这对我来说似乎有一种代码味道。我正在考虑将 DBLogger 类设为静态并直接使用它而不是注入(inject)它。这将消除一些困惑的代码,我的构造函数将变得干净,但依赖关系仍然存在。

我的问题是处理这种情况的推荐方法和最佳实践是什么,以及 OOP 和设计模式如何在这种情况下拯救我,阻止我违反开放封闭原则?

最佳答案

我喜欢为了单元测试而注入(inject)记录器。它可以更轻松地模拟记录器并避免在单元测试中定义真实记录器的依赖项。

此外,如果您的 IOC 容器已经为您定义了它,那么它是透明的并且注入(inject)起来更省力。

关于c# - 日志记录类应该作为依赖项插入还是应该使用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19946486/

相关文章:

c# - WPF Multiple CollectionView 在同一集合上具有不同的过滤器

design-patterns - 什么定义了业务对象

c# - 如何正确返回列表项进行编辑?

c# - 说服遗留应用程序 VB6 开发人员切换到 C#

c# - 多次调用计时器会产生奇怪的结果

c# - 在 Word Addin 中动态添加 RibbonButtons 会抛出 Collection is readonly

oop - 接口(interface)作为能力或接口(interface)作为类型

javascript - 如何使用 JavaScript 变量值作为对象选择器

c - 为什么 C 中的 printf() 方法设计为接受任意数量的参数?

java - Guice 最佳实践和反模式