c# - 如何编写客户端代码以允许记录器注入
问题描述
我正在编写一个 .NetStandard 应用程序,它是一个围绕 Web 服务/api 的薄包装器。我将在 .net 核心应用程序中使用这个客户端。我想登录我的客户,但不确定最佳实践是什么。
通过允许代码的使用者通过构造函数注入记录器,我已经达到了预期的结果,但这似乎很混乱,不是最佳实践。我以前会使用 Common.Logging,然后只针对接口编写代码并允许在运行时提供实现,但我不确定如何使用新的 Microsoft.Extensions.Logging 包实现相同的功能。
此外,我在一个无构造函数的类中有一个静态方法,它根本不能与构造函数注入一起使用。
public class MyClass {
public ILogger _logger;
public MyClass(ILogger Logger){
_logger = Logger;
}
public void SomeMethod(){
_logger.LogDebug("Called SomeMethod");
}
}
public class SomeServiceClass {
public static DoService(){
_logger.LogDebug("Doing Service");
}
}
我是 .net 核心的新手,所以也许我完全忽略了这一点。我应该为每个类创建一个记录器实例(与 log4net 一样)还是应该让 DI 容器创建记录器然后以某种方式注入它们?请有人告诉我处理这个用例的正确方法。
解决方案
public class MyClass {
public ILogger _logger;
public MyClass(ILogger Logger){
_logger = Logger;
}
public void SomeMethod(){
_logger.LogDebug("Called SomeMethod");
}
}
这个类是完全正确的。
public class SomeServiceClass {
public static DoService(){
_logger.LogDebug("Doing Service");
}
}
这堂课很臭。尝试访问 Net Core 使用的 ServiceProvider 时,静态方法不是很有用。我会考虑将此方法更改为已_logger
暴露的类的扩展方法?避免使用此类静态方法。
另一种方法可能是使用我编写的允许在 Net Core 中使用 AOP 的库?(如果主要目的是记录日志)
推荐阅读
- xslt - XSLT 转换为具有可重用生成 id 的 .csv
- assembly - 汇编:将代码块移动到单独的函数后代码失败
- java - 如何从 java 中运行 docker 容器
- c++ - 从另一个元组内对象的成员函数返回的值构造一个元组
- php - 如何在此 json 中回显消息
- python - Kivy文本输入:汉字
- java - Java 使用来自不同类中调用的不同方法的 var 值
- pandas-groupby - 查找每个位置 1 月份的平均风速
- java - 启动画面不能在模拟器上工作,但在 android pie 或更高版本上工作正常,也不能在 pie 下工作
- vue.js - 使用 Vue 和 Vuetify 以编程方式设置 v-checkbox