栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

记录器包装最佳实践

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录器包装最佳实践

我曾经使用诸如Common.Logging之类的日志记录外观(甚至隐藏了我自己的CuttingEdge.Logging库),但是如今,我使用了Dependency
Injection模式
,这使我可以将loggers隐藏在我自己的(简单的)抽象背后,该抽象遵循这两个Dependency反转原理和接口隔离原理(ISP),因为它只有一个成员,并且接口是由我的应用程序定义的;不是外部库。使您的应用程序核心部分对外部库的存在的了解降至最低;即使您无意替换日志记录库。对外部库的严格依赖使测试代码变得更加困难,并且使应用程序复杂化,而该API从未专门为您的应用程序设计。

这是我的应用程序中通常看起来像的样子:

public interface ILogger{    void Log(LogEntry entry);}public enum LoggingEventType { Debug, Information, Warning, Error, Fatal };// Immutable DTO that contains the log information.public class LogEntry {    public readonly LoggingEventType Severity;    public readonly string Message;    public readonly Exception Exception;    public LogEntry(LoggingEventType severity, string message, Exception exception = null)    {        if (message == null) throw new ArgumentNullException("message");        if (message == string.Empty) throw new ArgumentException("empty", "message");        this.Severity = severity;        this.Message = message;        this.Exception = exception;    }}

可选地,可以使用一些简单的扩展方法来扩展此抽象(允许接口保持狭窄并继续遵守ISP)。这使该接口的使用者的代码更加简单:

public static class LoggerExtensions{    public static void Log(this ILogger logger, string message) {        logger.Log(new LogEntry(LoggingEventType.Information, message));    }    public static void Log(this ILogger logger, Exception exception) {        logger.Log(new LogEntry(LoggingEventType.Error, exception.Message, exception));    }    // More methods here.}

由于该接口仅包含一个方法,因此您可以轻松创建一个代理以

ILogger
实现log4net,Serilog,Microsoft.Extensions.Logging,NLog或任何其他日志记录库的实现,并将您的DI容器配置为将其注入到类
ILogger
中构造函数。

请注意,使用单个方法在接口顶部使用静态扩展方法与使用具有多个成员的接口完全不同。扩展方法只是创建

LogEntry
消息并通过
ILogger
接口上唯一方法传递消息的帮助程序方法。扩展方法成为使用者代码的一部分;不是抽象的一部分。这不仅使扩展方法得以发展而无需更改抽象,扩展方法和功能。
LogEntry
构造函数总是在使用记录器抽象时执行,即使该记录器是存根/模拟的。在测试套件中运行时,这可以更加确定调用记录器的正确性。一员界面也使测试变得更加容易。由于具有许多成员的抽象,因此很难创建实现(例如,模拟,适配器和装饰器)。

当您执行此操作时,几乎不需要日志外观(或任何其他库)可能提供的某些静态抽象。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号