在不同.NET框架间共享Logger的技术实现问询
针对你的场景——在.NET Standard框架中实现跨.NET Core 1.2、2.0和.NET Framework 4.6+的Logger共享,核心思路是依赖抽象而非具体日志实现,利用.NET Standard兼容的日志抽象层来统一接口,再在各平台对接具体的日志提供器。下面是具体的实现步骤:
1. 引入兼容的日志抽象包
推荐使用Microsoft.Extensions.Logging.Abstractions,这个包是.NET Standard兼容的,能完美适配你所有的目标框架。它提供了标准的ILogger、ILogger<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抽象接口(比如包含LogInfo、LogError等方法),然后在各平台编写对应的实现类,但推荐使用Microsoft的抽象层,因为它有成熟的生态和多提供器支持。 - 确保所有平台的DI容器都能正确解析
ILogger<T>,大部分主流DI框架(Autofac、Unity、StructureMap等)都支持对Microsoft Logging抽象的适配。
内容的提问来源于stack exchange,提问作者LP13




