注意:我意识到这个问题类似于 this SO thread ,但我在这里问的是一个具体案例,所以请不要将这个问题作为那个问题的重复来关闭。
我正在努力让我的 C# 更加函数化,并且一直在阅读 Enrico Buonanno 所著的《C# 函数式编程》。他展示的技术之一是 Try
类,它允许您优雅地处理异常。您可以看到 Try
类的代码 here .
这一切都非常简洁,但在真正的应用程序中,我想要记录异常。由于他的类(class)是静态的,我看不出有什么办法。正如上面链接的 SO 问题(以及其他问题)中所解释的,注入(inject)静态类要么无法完成,要么不是一个好主意。
我能看到的唯一选项是:
要求使用代码创建
Try
类的实例(目前用他的代码不可能),而不是调用静态方法。这使得代码不那么干净将静态
ILogger
属性添加到Try
类,并在使用该类之前设置它。我不想这样做,因为Try
类将在我的应用程序的客户端和服务器上使用,并且记录器在这两种情况下会有所不同将
ILogger
参数添加到类方法中。出于与 1 相同的原因,我不喜欢这个。访问
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/