c# - 如何在不失去单元测试能力的情况下将日志记录添加到静态类?

标签 c# unit-testing dependency-injection functional-programming

注意:我意识到这个问题类似于 this SO thread ,但我在这里问的是一个具体案例,所以请不要将这个问题作为那个问题的重复来关闭。

我正在努力让我的 C# 更加函数化,并且一直在阅读 Enrico Buonanno 所著的《C# 函数式编程》。他展示的技术之一是 Try 类,它允许您优雅地处理异常。您可以看到 Try 类的代码 here .

这一切都非常简洁,但在真正的应用程序中,我想要记录异常。由于他的类(class)是静态的,我看不出有什么办法。正如上面链接的 SO 问题(以及其他问题)中所解释的,注入(inject)静态类要么无法完成,要么不是一个好主意。

我能看到的唯一选项是:

  1. 要求使用代码创建 Try 类的实例(目前用他的代码不可能),而不是调用静态方法。这使得代码不那么干净

  2. 将静态ILogger 属性添加到Try 类,并在使用该类之前设置它。我不想这样做,因为 Try 类将在我的应用程序的客户端和服务器上使用,并且记录器在这两种情况下会有所不同

  3. ILogger 参数添加到类方法中。出于与 1 相同的原因,我不喜欢这个。

  4. 访问 try 类中的依赖项解析器并获取记录器的实例。这意味着使用 Try 的代码最终也会记录到文件中,这不是一个好主意。

有人有什么建议吗?这种方法看起来非常干净整洁,但它似乎还缺少一个明显的基本功能。

最佳答案

为什么不让静态方法创建类的实例,然后调用一个完成工作的私有(private)实例方法呢?我不熟悉 Try,但你可以这样做(警告 - 空气代码!)...

public class Try<T> {
  // Assuming NInject, but same applies to any other container
  [Inject]
  ILogger Logger { get; set; }

  private Try() {
    // stops anyone from outside this project from creating an instance of Try
  }

  public static Exceptional<T> Do(Action f) {
    Try<T> t = new Try<T>();
    return t.DoPrivate<T>(f);
  }

  private Exceptional<T> DoPrivate<T>(Action f) {
    // This is an instance method, so has access to the injected logger
    try {
      return f();
    } catch (Exception ex) {
      Logger.Log(ex.Message);
      return ex;
    }
  }
}

这有帮助吗?正如我所说,我不熟悉他的代码,所以您可能需要稍微调整一下,但我认为这会给您想要的。

关于c# - 如何在不失去单元测试能力的情况下将日志记录添加到静态类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51026951/

相关文章:

运行我的第一个测试时 PHPunit Framework TypeError

C# 替换前导撇号 Excel COM

c# - IEnumerable<dynamic> 与 linq

c# - 更新自定义工作流程事件中创建的记录 -CRM -C#

c# - 无法设置 TestContext 属性

dependency-injection - Ninject Owin 请求范围静默失败

c# - 使用 WCF 服务

java - 单元测试是否已捕获并处理异常

.net - IoC 容器如何实现依赖注入(inject)与我将如何实现它相比

java - 如何通过依赖注入(inject)和垃圾收集来防止循环引用?