将日志服务添加到我的应用程序中

本文关键字:我的 应用程序 添加 日志 服务 | 更新日期: 2023-09-27 18:33:43

我有一个应用程序(遗留代码(

包含具有save()方法的接口Icomponent

以及许多实现它的类。

我想在每次保存((后添加日志。

更新:

我有几个设计想法:

  • Singelton Logger - 将在每个可记录的操作后调用

我认为LogService是单格尔顿的经典案例,但我读到它很难进行单元测试。

  • 装饰器 + 记录器使用 Ioc 初始化

使用修饰器模式通过其他log()方法进行Icomponent

创建LogService类,该类从每个装饰器的log()调用

  • AOP - 面向方面的编程

我读过一些关于这个,但不知道。

它适用于 c# 吗?

  • 您对解决方案的设计是什么?

更新2

阅读代码后,我看到还有另一层接口

在混凝土层之前。我认为我不应该装饰每个特定的界面。右?

I_AComponente : IComponente
I_BComponente : IComponente
A : I_AComponente
B : I_BComponente

将日志服务添加到我的应用程序中

它根本不必须是单例。考虑:

public void ComponentDecorator : IComponent
{
    private IComponent component;
    private ILogger logger;
    public ComponentDecorator(IComponent component, ILogger logger)
    {
        this.component = component;
        this.logger = logger;
    }
    public void Save()
    {
        this.component.Save();
        this.logger.Log("Some important message");
    }
}

由于无论如何您都会将装饰组件注入装饰器,因此不妨注入记录器(这样就很容易测试了(。从单元测试的角度来看,logger来自哪里将无关紧要。

此外,与其滚动自己的记录器,不如检查现有的记录器,如Apache log4net。

编辑

单例记录器难以测试的说法可能来自这样一个事实,即 C# 中的单例通常使用某处static字段或静态类来实现。 假设您有:

public static LoggerService
{
    public static Log(string message) { ... }
}

现在,在你的装饰器的方法中,你可能不得不按照这些思路做一些事情:

public void Save()
{
    this.component.Save();
    LoggerService.Log("Some important message");
}

这使得测试Save方法几乎是不可能的,因为方法内部具有紧密耦合的依赖项。如果您可以将测试配置为不写入文件系统LoggerService,那也不错(但是,它仍然绕过问题而不是解决问题(。

通过接口注入时,该问题自然消失了。 LoggerService可能仍然是静态类,但它可以简单地提供非静态记录器(并管理它们的生存期/范围(。这根本不会使单元测试变得困难。

是的!AOP适用于C锐http://www.developerfusion.com/article/5307/aspect-oriented-programming-using-net/

AOP 是避免在代码中写入 Log 语句的好方法。下面是如何在您的应用程序中实现 AOP 的示例。但是,以下链接中提供的方法的唯一缺点是您还需要配置温莎城堡http://ayende.com/blog/3474/logging-the-aop-way