如何编写客户端代码以允许记录器注入
Posted
技术标签:
【中文标题】如何编写客户端代码以允许记录器注入【英文标题】:How to write client code to allow logger injection 【发布时间】:2019-06-11 10:04:59 【问题描述】:我正在编写一个 .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 容器创建记录器然后以某种方式注入它们?请有人告诉我处理这个用例的正确方法。
【问题讨论】:
构造函数注入是大多数时候DI应该怎么做,为什么你认为它很乱?此外,静态类与 DI 相悖,所以不要指望那里有最佳实践 有方法或构造函数注入,这就是 DI 的工作原理和 SOLID 原则之一......在这种情况下,可以通过构造函数使用 ILogger 实例,因为您不希望实例在运行时更改状态. 【参考方案1】: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 的库? (如果主要目的是记录日志)
https://github.com/f135ta/SimpleProxy
【讨论】:
以上是关于如何编写客户端代码以允许记录器注入的主要内容,如果未能解决你的问题,请参考以下文章
恶意软件将代码注入我的 Dojo/WebSocket 应用程序:如何防止?