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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:06:25