[我们有现有的服务,其中Logging的接口已注入Child构造函数中并传递给其父级(基础)。
现有:
Public class Child: Parent
public Ctor(ILogger logger) : base(ILogger logger)
新:(将ILogger修改为IMyLogger,内部使用Serilog Logger API进行日志记录)
Public class Child: Parent
public Ctor(IMyLogger<Child> logger) : base(IMyLogger<Parent> logger)
以上显然显然行不通。但我需要解决此问题,因为这些构造函数通常仅用于单元测试目的,或保留在DI框架注册时将使用的某些层次结构链!
为什么需要引入通用Logger是将类型绑定到Logger实现,以后可以将其用作我的Serilog源上下文。
我可以解决上述重构的2种方法:
选项1)保留ILogger,而不使用通用。使用StackFrames查找调用者类型,并将其分配给SourceContext,稍后将对其进行记录]
选项2)将ILogger重构为ILogger,但不将记录器传递给基本构造函数。公共班级儿童:父母公共Ctor(ILogger记录器):base()
选项1)使用反射,我们永远不能依赖堆栈框架来找到进行Logging调用的正确方法。性能也会受到影响。
我觉得选项2)是一种更干净的方法,其中每个Child都有自己的基于上下文的Logger,以后可以在单元测试中对其进行模拟。
我觉得每项服务记录仪应各有一个。但是我很乐意被各种各样的想法和其他更好的方式来处理这种设计。 :-)
[我们有现有的服务,其中Logging的接口已注入Child构造函数中并传递给其父级(基础)。现有:公共类子级:父公共Ctor(ILogger ...
我使用Fody的Anotar.Serilog
插件取得了很大的成功,因此我不必担心这样的细节。