删除对日志记录代码的依赖关系

本文关键字:依赖 关系 代码 记录 日志 删除 | 更新日期: 2023-09-27 17:56:18

我有更多的问题,因为我正在重构我接管的相当大的代码段。

它不是模块化的,基本上它是面向对象的伪代码。它包含硬编码的依赖项,没有接口,多个职责等。

其中,它包含大量对称为Audit的类的内部调用,其中包含Log,Info,LogError等方法。该类必须在应用程序配置中配置才能工作,否则它将崩溃。这对我来说是主要的痛苦。请让我们在响应中关注这个问题,即使客户端代码独立于日志记录类/解决方案/框架

现在,我希望重构那些硬编码了 Audit 类依赖项的类,以获得几个好处:

  1. 首先是将它们很好地提取到不同的程序集中,因为我将需要其他应用程序中可用的一些功能(例如生成附件代码 - 我们称之为 AttachmentsGenerator 类,直到现在它对一个应用程序是特定的,但现在该代码可以在很多地方使用)
  2. 删除内部依赖项,以便其他应用程序将利用我的 AttachmentsGenerator 类,而无需添加对其他的引用
  3. 做一个魔术技巧,以便允许附件生成器类报告一些审核信息,跟踪等。但我不希望它有硬编码的实现。事实上,我不希望它是强制性的,因此可以在没有配置内部日志记录的情况下使用 AttachmentsGenerator,并且客户端代码无需添加对另一个程序集的引用即可使用日志记录。底线:如果客户端代码想要使用 AttachmentsGenerator,它会添加对包含该类的程序集的引用,然后它使用 new 运算符,仅此而已。

在设计模式等方面,我可以使用哪种方法来实现它?我将不胜感激一些指向解决该问题的文章的链接 - 因为在回答中阐述想法可能很耗时。或者,如果您可以建议简单的接口/类/程序集草图。

多谢帕韦乌

编辑1:由于我的问题不太清楚,我再改一次:这是我的计划,还有其他有趣的方法吗?

删除对日志记录代码的依赖关系

似乎最简单的

方法是使用依赖注入。

  1. 使用日志记录方法创建通用ILogger接口。

  2. 创建一个具体的ILogger实现,对所有方法都不做任何事情(例如 NullLogger

  3. 创建另一个具体的实现,它实际上通过您选择的任何框架(例如log4net)进行日志记录

  4. 使用 DI 工具(弹簧、结构图等)注入适当的实现,具体取决于您是否要启用日志记录。

将日志记录(以及任何其他横切关注点)实现为装饰器。这比必须将一些 ILogger 接口注入每个服务(这将违反单一责任原则和 DRY)更可靠。