在C#(serilog)中,如何处理可以以正确的方式保留通用接口+父/子关系的设计重构?

问题描述 投票:0回答:1

[我们有现有的服务,其中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 ...

c# serilog
1个回答
0
投票

我使用Fody的Anotar.Serilog插件取得了很大的成功,因此我不必担心这样的细节。

© www.soinside.com 2019 - 2024. All rights reserved.