【问题标题】:How to Avoid Infinite Loops, Best Practices如何避免无限循环,最佳实践
【发布时间】:2012-03-22 13:14:05
【问题描述】:

我有一个 C# 类来帮助我记录错误 (ErrorClass)。

  • 该类有 3 个方法。将错误记录到:文件系统、Windows 事件、 电子邮件。
  • 3 种方法中有 2 种需要设置,例如“发送电子邮件”或“目录路径”。
  • 设置存储在注册表中
  • 我使用依赖注入在ErrorClass 中实例化RegistryClass .

这就是我在注册表类中实例化 ErrorHandle 类的方式

ErrorHandle _ErrorHandle = new ErrorHandle();

下面是我如何在 ErrorHandle 类中实例化注册表类

RegistryTools _GetRegistry = new RegistryTools();

我有一个类可以帮助我从注册表中检索值 (RegistryClass)

  • 注册表类需要处理错误
  • 我使用依赖注入在RegistryClass 中实例化errorClass

当我在两个类中都使用依赖注入时,当出现错误时会创建一个 Endless LOOP。

处理这种情况的建议方法或最佳实践是什么:

  • 我应该访问ErrorClass 中的注册表吗?
  • 我不应该错误处理RegistryClass吗?
  • 我是否应该为 RegistryClass?

【问题讨论】:

  • “最佳实践”是让您的记录器尽可能少地依赖外部服务。毕竟,您希望 yo logger 随时可用。我不知何故怀疑注册表是日志记录的重要依赖项 - 至少,您应该考虑回退解决方案
  • 你是对的。我修改了问题的标题

标签: c# .net error-handling


【解决方案1】:

您对 DI 使用什么机制?如果您使用 setter 注入,则应该没有什么可以阻止您执行以下操作:

var logger = new ErrorClass();
var registry = new RegistryClass();
logger.Registry = registry;
registry.Logger = logger;

【讨论】:

  • 我修改了我原来的问题以包括我使用 DI 的方式。
  • 我想避免无限循环。所以问题是要遵循的最佳做法是什么。
【解决方案2】:

不要重新发明这个轮子。有一个久经考验的 .NET 开源日志框架,log4net。如果你觉得有必要使用 DI,你可以这样做too。 log4net 使用 XML 文件进行配置,与处理注册表相比,该文件更易于访问且风险更少。它还吞下自己的错误,并通过调试跟踪使其可访问。

【讨论】:

  • 我通过重新发明轮子获得报酬。现在回到我的问题,你会怎么做?谢谢
  • 我不是要求重写日志记录代码。问题也不在于日志记录。问题是关于避免无限循环的最佳实践。
  • 我很抱歉回答你应该问的问题。继续。
  • 你应该为自己的无知道歉。 Log4net 并不能解决所有问题——我也有一部分自己的日志框架,作为应用程序框架的一部分。它将大多数东西发送到 Log4Net,但它允许在需要时更换 lo4gnet。而一些“错误”不是日志级别错误,而是数据级别(即程序工作,一组数据被标记为错误)。
  • 如果某些东西可以满足您的大部分需求,但不是全部,那么扩展它,不要重写它。如果它不执行您想要的任何操作,然后找到其他可以执行的操作(很可能某些内容已经存在),否则作为最后的手段,您可以自己动手。我很难相信这种情况属于后一类。
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2013-03-25
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多