gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:18 25 4
gpt4 key购买 nike

注意:我意识到这个问题类似于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com