c# - 删除对日志代码的依赖

标签 c# .net oop design-patterns dependency-injection

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

它不是模块化的,基本上是伪面向对象的代码。它包含硬编码的依赖项、无接口(interface)、多重责任等。只是困惑

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

现在,我想要那些具有 Audit 类依赖性硬编码和重构的类,以获得几个好处:

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

在设计模式等方面我可以使用什么样的方法来实现它?我会很感激一些指向解决该问题的文章的链接——因为在回答中详细阐述想法可能很耗时。或者,如果您可以建议简单的接口(interface)/类/装配草图。

非常感谢, 帕维尔

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

最佳答案

似乎最简单的方法是使用依赖注入(inject)。

  1. 创建带有日志记录方法的通用 ILogger 接口(interface)。

  2. 创建一个 ILogger 的具体实现,它对所有方法(例如 NullLogger)什么都不做

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

  4. 使用 DI 工具(spring、结构图等)根据您是否要启用日志记录来注入(inject)适当的实现。

关于c# - 删除对日志代码的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996820/

相关文章:

c# - 开关 : Multiple values in one case?

c# - 3 层架构 - 数据层仅存储数据?

java - 如何在专门的子类中坚持 DRY 原则?

language-agnostic - 工厂和模式如何关联?

PHP 多个需要连接

c# - 在 Visual Studio 2015 中重命名时导致 "unresolvable conflict(s)"的原因是什么?

c# - 使用NEST中的一个集合查询一个单一值

c# - 使用 .NET C# 绘制实时数据图表

.net - Azure 最快的通信协议(protocol)

c# - 如何设置 nuget 引用的动态路径?