MvvmCross 7.0.0 WPF项目依赖注入无法解析ILogger类型问题求助
这个问题的核心原因很明确——MvvmCross的默认IoC容器并没有自动注册.NET标准库中的ILogger接口,而你之前熟悉的Blazor是基于ASP.NET Core生态的,它的DI系统会自动配置并注册日志相关服务,所以不用手动处理。
下面给你两种可行的解决方案:
方案1:改用MvvmCross自带的日志体系(推荐)
MvvmCross本身有一套成熟的日志框架,默认已经完成了IoC注册,直接用它最省心。你只需要修改TestService的构造函数依赖,替换成MvvmCross的IMvxLog接口:
using MvvmCross.Logging; public class TestService : ITestService { private readonly IMvxLog _logger; // 依赖IMvxLog而非ILogger public TestService(IMvxLog logger) { _logger = logger; } public string Run() { // 使用MvvmCross的日志方法 _logger.Info("Run"); return "HelloWorldFROMrUN!"; } }
修改后,你的原有注册代码不需要任何改动,直接运行就能正常解析——因为MvvmCross在初始化时已经自动注册了IMvxLog的实现,会自动注入到TestService中。
方案2:手动注册.NET的ILogger到MvvmCross IoC
如果你坚持要使用.NET标准的ILogger,那需要手动在MvvmCross的IoC容器中注册日志工厂和对应的ILogger实例/泛型类型。
在Core项目的App类的Initialize方法中,先配置并注册ILoggerFactory,再注册ILogger相关类型:
using Microsoft.Extensions.Logging; public override void Initialize() { // 1. 创建并注册日志工厂 var loggerFactory = LoggerFactory.Create(builder => { // 根据你的需求添加日志输出目标,比如Debug窗口、控制台等 builder.AddDebug(); // 如果是带控制台的WPF项目,可以加上这句 // builder.AddConsole(); }); Mvx.IoCProvider.RegisterSingleton(loggerFactory); // 2. 注册泛型的ILogger<T>(这样任何依赖ILogger<T>的类都能被解析) Mvx.IoCProvider.RegisterSingleton(typeof(ILogger<>), typeof(Logger<>)); // 3. 注册你的业务服务 Mvx.IoCProvider.RegisterType<ITestService, TestService>(); // 现在解析服务就不会报错了 var testService = Mvx.IoCProvider.Resolve<ITestService>(); base.Initialize(); }
这样配置后,MvvmCross的IoC容器就能找到ILogger的实现,成功注入到TestService中。
为什么Blazor中不需要这么做?
Blazor是ASP.NET Core生态的一部分,当你创建Blazor项目时,模板已经自动在Program.cs中配置了日志服务(比如builder.Logging.AddConsole()),ASP.NET Core的DI系统会自动注册ILogger、ILoggerFactory等相关类型,所以注入时不需要手动处理。而MvvmCross是独立的MVVM框架,它的IoC容器不会自动包含这些ASP.NET Core专属的服务,因此需要手动注册。
内容的提问来源于stack exchange,提问作者Yong

