.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!
但这里存在两个问题:
InjectionFactory已标记为过时:该API被标记为[Obsolete],官方未明确支持终止时间,不建议继续使用;- 日志记录的类型不准确:日志中显示的类型是
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
相关产品推荐
相关产品推荐

