Unity 4.0.0与.NET4.8下Microsoft Logger注册及依赖解析失败求助
问题:Unity容器无法解析带ILogger依赖的Worker类型
环境与报错
使用Unity 4.0.0 + .NET 4.8,项目抛出错误:
Resolution of the dependency failed, type = "Test.IWorker", name = "(none)"
Worker类代码:
public class SimpleWorker : IWorker { private readonly ILogger _logger; public SimpleWorker(ILogger<SimpleWorker> logger) { _logger = logger; } }
已尝试的无效方案
- 反射调用LoggerFactory扩展方法注册:
_container = new UnityContainer(); var loggerFactory = new LoggerFactory(); var factoryMethod = typeof(LoggerFactoryExtensions). GetMethods(BindingFlags.Static | BindingFlags.Public) .First(x => x.ContainsGenericParameters); _container.RegisterType(typeof(ILogger<>), new InjectionFactory((c, t, s) => { var genFactoryMethod = factoryMethod.MakeGenericMethod(t.GetGenericArguments()[0]); return genFactoryMethod.Invoke(null, new object[] { loggerFactory }); }));
- 直接注册具体ILogger类型:
_container = new UnityContainer(); _container.RegisterType<ILogger<SimpleWorker>>();
补充问题:LoggerFactory注册后的新报错
尝试以下注册代码后:
var factory = new LoggerFactory(); factory.AddLog4Net("log4net.config"); container.RegisterInstance<ILoggerFactory>(factory); container.RegisterType(typeof(ILogger<>), typeof(Logger<>));
执行容器解析遍历代码时抛出错误:
Resolving Microsoft.Extensions.Logging.ILogger`1[TCategoryName][],(none)
---> System.InvalidOperationException: Could not execute the method because either the method itself or the containing type is not fully instantiated.
解决方案
1. 正确注册ILogger<>的方式
Unity 4.x对泛型类型的注册需要明确关联工厂逻辑,修正后的注册代码可确保依赖正常解析:
var container = new UnityContainer(); // 初始化LoggerFactory并配置log4net var loggerFactory = new LoggerFactory(); loggerFactory.AddLog4Net("log4net.config"); // 将LoggerFactory注册为容器单例 container.RegisterInstance<ILoggerFactory>(loggerFactory, new ContainerControlledLifetimeManager()); // 为泛型ILogger<>绑定创建逻辑,通过LoggerFactory生成具体实例 container.RegisterType(typeof(ILogger<>), new InjectionFactory((container, type, name) => { var categoryType = type.GetGenericArguments()[0]; return container.Resolve<ILoggerFactory>().CreateLogger(categoryType); })); // 注册Worker实现 container.RegisterType<IWorker, SimpleWorker>();
2. 解决ResolveAll引发的错误
ResolveAll会尝试解析开放泛型类型(如ILogger<>),但未闭合的泛型无法实例化,需在遍历中跳过这类类型:
foreach (var item in _unityContainer.Registrations) { // 跳过开放泛型定义,避免无效解析 if (item.RegisteredType.IsGenericTypeDefinition) continue; var named = _unityContainer.ResolveAll(item.RegisteredType); if (_unityContainer.IsRegistered(item.RegisteredType)) { var tmp = _unityContainer.Resolve(item.RegisteredType); } }
内容的提问来源于stack exchange,提问作者pakerinjo
相关产品推荐
相关产品推荐

