ServiceStack容器无法解析ILogger依赖的外部类问题求助
解决ServiceStack容器无法解析ILogger的问题
ServiceStack的默认Funq容器并未内置对Microsoft.Extensions.Logging中ILogger<T>的支持,需要手动注册适配,以下是几种可行方案:
方案1:直接注册特定类型的ILogger实例
若已配置好Microsoft.Extensions.Logging的日志工厂,可直接为依赖ILogger<T>的类型注册对应实例:
// 初始化日志工厂(根据实际需求配置日志提供器) var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); // 为MyClass注册ILogger<MyClass> container.Register<ILogger<MyClass>>(c => loggerFactory.CreateLogger<MyClass>()); // 为ElasticSearchEngine注册ILogger<ElasticSearchEngine> container.Register<ILogger<ElasticSearchEngine>>(c => loggerFactory.CreateLogger<ElasticSearchEngine>());
方案2:注册泛型工厂处理所有ILogger
如果多个类依赖不同的ILogger<T>,可以通过泛型工厂批量处理,避免重复注册:
var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); }); // 注册泛型ILogger<T>的创建逻辑 container.RegisterAutoWiredType(typeof(ILogger<>), (type, container) => loggerFactory.CreateLogger(type.GetGenericArguments()[0]));
方案3:替换ServiceStack容器为Microsoft.Extensions.DependencyInjection
若项目已使用MSDI,可直接将ServiceStack的容器适配为MSDI,自动支持ILogger<T>的解析:
var services = new ServiceCollection(); // 添加MSDI日志服务 services.AddLogging(builder => builder.AddConsole()); // 注册业务服务 services.AddSingleton<ISearchEngine, ElasticSearchEngine>(); // 构建MSDI容器并替换ServiceStack默认容器 var msdiProvider = services.BuildServiceProvider(); HostContext.Container.Adapter = new MicrosoftDependencyInjectionAdapter(msdiProvider);
必要依赖说明
- 方案1/2需安装NuGet包:
Microsoft.Extensions.Logging - 方案3需安装NuGet包:
ServiceStack.Mvc(包含MicrosoftDependencyInjectionAdapter)
内容的提问来源于stack exchange,提问作者Jan Martin
相关产品推荐
相关产品推荐

