You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制台应用中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:30:36