控制台应用中Unity IoC+Serilog无法解析ILogger实例求助
解决Unity IoC无法解析Serilog ILogger的问题
看起来你遇到的核心问题是命名空间冲突或者类型匹配错误,导致Unity尝试去实例化Serilog内部的Logger类(而不是使用你已经创建好的实例),但这个类的构造函数并非公开的,所以抛出了构造函数选择失败的异常。下面分两种常见场景给出解决方案:
场景1:你想直接使用Serilog的ILogger
首先确认你的代码中所有ILogger引用的都是Serilog.ILogger(而非Microsoft.Extensions.Logging.ILogger),这是两个完全不同的接口,很容易混淆。
正确的注册与解析方式:
using Serilog; using Unity; // 初始化Unity容器 var container = new UnityContainer(); // 创建Serilog实例并注册为单例 var serilogLogger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); container.RegisterInstance<ILogger>(serilogLogger, new ContainerControlledLifetimeManager()); // 解析时明确使用Serilog的ILogger var logger = container.Resolve<Serilog.ILogger>();
场景2:你想使用Microsoft.Extensions.Logging的ILogger(更适合.NET Core/.NET 5+集成)
如果你的项目基于.NET Core生态,或者需要和微软的日志体系集成,更合理的方式是把Serilog作为微软ILogging框架的日志提供者,而非直接注册Serilog的私有接口。
步骤1:安装必要的NuGet包
确保你安装了Serilog.Extensions.Logging包,它负责将Serilog接入微软的日志系统。
步骤2:注册日志服务
using Microsoft.Extensions.Logging; using Serilog; using Unity; var container = new UnityContainer(); // 创建Serilog实例 var serilogLogger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); // 注册LoggerFactory并添加Serilog作为提供者 container.RegisterInstance<ILoggerFactory>(new LoggerFactory().AddSerilog(serilogLogger)); // 注册非泛型ILogger container.RegisterFactory<ILogger>(context => context.Resolve<ILoggerFactory>().CreateLogger("Default")); // 注册泛型ILogger<T>(可选,适合强类型日志场景) container.RegisterFactory(typeof(ILogger<>), (context, type) => { var loggerType = type.GenericTypeArguments[0]; return context.Resolve<ILoggerFactory>().CreateLogger(loggerType.FullName); }); // 解析示例 var genericLogger = container.Resolve<ILogger<YourClass>>(); var defaultLogger = container.Resolve<ILogger>();
为什么之前的注册失败?
你遇到的ResolutionFailedException本质原因是:Unity尝试去实例化Serilog.Core.Logger类,但这个类的构造函数是**内部(internal)**的,Unity无法通过反射访问并调用它。当你注册的ILogger类型和解析时使用的ILogger类型不匹配时(比如注册的是Serilog的ILogger,但解析的是微软的ILogger),Unity就会尝试自动构造对应的实现类,从而触发这个错误。
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

