首页 > 解决方案 > 如何编写客户端代码以允许记录器注入

问题描述

我正在编写一个 .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 容器创建记录器然后以某种方式注入它们?请有人告诉我处理这个用例的正确方法。

标签: c#.netlogging.net-core

解决方案


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


推荐阅读