You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在不同.NET框架间共享Logger的技术实现问询

跨.NET平台的Logger共享方案

针对你的场景——在.NET Standard框架中实现跨.NET Core 1.2、2.0和.NET Framework 4.6+的Logger共享,核心思路是依赖抽象而非具体日志实现,利用.NET Standard兼容的日志抽象层来统一接口,再在各平台对接具体的日志提供器。下面是具体的实现步骤:

1. 引入兼容的日志抽象包

推荐使用Microsoft.Extensions.Logging.Abstractions,这个包是.NET Standard兼容的,能完美适配你所有的目标框架。它提供了标准的ILoggerILogger<T>等抽象接口,让你的MyFactory无需关心底层日志实现。

在你的.NET Standard框架项目中安装这个包:

Install-Package Microsoft.Extensions.Logging.Abstractions -Version 1.1.2
# 或者用.NET CLI
dotnet add package Microsoft.Extensions.Logging.Abstractions --version 1.1.2

注:选择1.1.2版本是因为它支持.NET Standard 1.3,能覆盖你的所有目标框架(.NET Core 1.2/2.0、.NET Framework 4.6+)。

2. 修改MyFactory依赖抽象日志接口

MyFactory中的_logger字段改为依赖ILogger<MyFactory>(或基础的ILogger),并通过构造函数注入,这样依赖注入框架可以在不同平台注入对应的实现:

using Microsoft.Extensions.Logging;

public interface IMyFactory { /* 你的接口定义 */ }

public class MyFactory : IMyFactory
{
    private readonly ILogger<MyFactory> _logger;
    private IDictionary<string, /* 你的类型 */> _services;

    // 通过构造函数注入日志抽象
    public MyFactory(ILogger<MyFactory> logger)
    {
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        // 其他初始化逻辑
    }

    // 示例日志使用
    public void SendMessage(string message)
    {
        _logger.LogInformation("发送消息:{Message}", message);
        // 你的业务逻辑
    }
}

3. 在各平台应用中配置日志实现

接下来,在不同平台的应用中,将具体的日志提供器注册到DI容器,让框架能为MyFactory注入正确的Logger实例:

.NET Core 1.2/2.0 配置

在Startup类中,利用内置的Logging框架添加日志提供器(比如Console、Debug),并注册MyFactory为单例:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 添加日志服务
        services.AddLogging(builder =>
        {
            builder.AddConsole();
            builder.AddDebug();
            // 你还可以添加其他提供器,比如NLog/Serilog
        });

        // 注册MyFactory为单例
        services.AddSingleton<IMyFactory, MyFactory>();
    }
}

.NET Framework 4.6+ 配置

对于.NET Framework应用,你可以选择对接System.Diagnostics.Trace,或者第三方日志库(如NLog、Serilog),这里以Microsoft.Extensions.Logging.TraceSource为例:

首先安装适配包:

Install-Package Microsoft.Extensions.Logging.TraceSource -Version 1.1.2

然后在DI容器(比如Autofac、Unity,或者自定义DI)中注册日志服务和MyFactory

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.TraceSource;

// 构建服务容器
var services = new ServiceCollection();
services.AddLogging(builder =>
{
    builder.AddTraceSource(new SourceSwitch("MyFactorySwitch", "Information"),
                          new ConsoleTraceListener());
});

services.AddSingleton<IMyFactory, MyFactory>();

// 获取服务实例
var serviceProvider = services.BuildServiceProvider();
var factory = serviceProvider.GetService<IMyFactory>();

如果使用第三方日志库(比如NLog),只需替换对应的适配包(如NLog.Extensions.Logging),并在日志配置中添加NLog提供器即可,接口层无需修改。

4. 额外建议

  • 如果你的团队有自定义日志需求,也可以自己定义一个极简的ILogger抽象接口(比如包含LogInfoLogError等方法),然后在各平台编写对应的实现类,但推荐使用Microsoft的抽象层,因为它有成熟的生态和多提供器支持。
  • 确保所有平台的DI容器都能正确解析ILogger<T>,大部分主流DI框架(Autofac、Unity、StructureMap等)都支持对Microsoft Logging抽象的适配。

内容的提问来源于stack exchange,提问作者LP13

火山引擎 最新活动