如何编写客户端代码以允许记录器注入

时间:2019-06-11 10:04:59

标签: c# .net logging .net-core

我正在编写.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容器创建记录器,然后以某种方式注入它们?请有人可以向我展示处理此用例的正确方法。

1 个答案:

答案 0 :(得分:0)

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