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

.NET 4.7.2下Unity容器集成log4net:替代过时InjectionFactory方案

Unity集成log4net替代过时InjectionFactory的方案

原实现及问题

之前我通过Unity框架结合log4net实现依赖注入,使用的代码如下:

原代码片段:

var container = new UnityContainer().RegisterType<ILog>(new InjectionFactory(x => LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)));
var myClass = container.Resolve<MyClass>();

myClass.DoUseAndWriteLog();
myClass.DoSomethingElseWriteLog();

public class MyClass
{
    public readonly ILog Logger;
    public MyClass(ILog logger)
    {
        Logger = logger;
    }

    public void DoUseAndWriteLog()
    {
        Logger.Debug("In MyClass");
    }

    public void DoSomethingElseWriteLog()
    {
        Logger.Debug("In MyClass other method!");
    }
}

运行后日志输出如下:

2025-03-13 16:38:15,055 [1] DEBUG Testservice.Program+<>c - In MyClass
2025-03-13 16:38:17,845 [1] DEBUG Testservice.Program+<>c - In MyClass other method!

但这里存在两个问题:

  1. InjectionFactory已标记为过时:该API被标记为[Obsolete],官方未明确支持终止时间,不建议继续使用;
  2. 日志记录的类型不准确:日志中显示的类型是Testservice.Program+<>c(匿名类),而非实际注入的MyClass,无法准确定位日志来源。

我需要基于Unity最新API重新实现该集成,满足单元测试代码覆盖的需求,同时处理log4net的配置问题。

替代方案(使用Unity扩展)

通过Unity的扩展机制替代过时的InjectionFactory,代码如下:

解决方案代码:

var container = new UnityContainer(); 
container.AddNewExtension<Log4NetExtension>(); 

container.RegisterType<MyClass>(); 
var myClass = container.Resolve<MyClass>();
myClass.DoUseAndWriteLog(); 
myClass.DoSomethingElseWriteLog();

注意事项

  • 需确保Log4NetExtension类已正确引入;
  • 必须配置log4net.config文件,明确日志文件路径、滚动备份文件数量、单个文件大小限制等细节;
  • 扩展方式会自动为每个注入的类型创建对应ILog实例,日志中会显示正确的目标类型,便于定位问题。

内容的提问来源于stack exchange,提问作者Badrinath Ajabe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:22:42