Acumatica 22R2依赖注入中非泛型ILogger失效问题咨询
解决Acumatica 22R2中非Graph对象注入非泛型ILogger的问题
方案1:注入Microsoft非泛型ILogger(推荐,适配新版本体系)
Acumatica 22R2及后续版本默认采用Microsoft.Extensions.Logging框架,针对非Graph关联对象,可通过DI容器直接注册并注入非泛型ILogger:
- 在DI注册代码中添加如下逻辑:
builder.Register(context => { var loggerFactory = context.Resolve<ILoggerFactory>(); // 可指定自定义日志类别,比如业务模块名称 return loggerFactory.CreateLogger("Default"); }).As<Microsoft.Extensions.Logging.ILogger>();
- 在非Graph类中通过构造函数注入:
public class YourNonGraphService { private readonly Microsoft.Extensions.Logging.ILogger _logger; public YourNonGraphService(Microsoft.Extensions.Logging.ILogger logger) { _logger = logger; } public void ExecuteOperation() { _logger.LogInformation("非Graph对象日志测试:信息"); _logger.LogError("非Graph对象日志测试:错误"); } }
方案2:适配Serilog ILogger(若需保留Serilog接口)
如果必须使用Serilog的ILogger接口,需确保注册的实例能正确接入Acumatica的日志输出流程。22R2中PXTrace.Logger已改为适配Microsoft日志体系的包装类,原直接注册方式失效,可通过以下方式调整:
builder.Register(context => { // 从Acumatica日志工厂获取实例并转换为Serilog ILogger var microsoftLogger = context.Resolve<ILoggerFactory>().CreateLogger("SerilogWrapper"); return (Serilog.ILogger)microsoftLogger; }).As<Serilog.ILogger>();
注意:该方式依赖Acumatica底层仍使用Serilog作为日志实现,若默认实现变更则会失败,优先推荐方案1。
核心原因说明
22R2版本中Acumatica全面切换到Microsoft.Extensions.Logging日志体系,原直接注册Serilog ILogger的方式因底层实现变更失效,必须适配新的框架逻辑才能让日志正常写入追踪系统。非Graph对象的DI注入逻辑与Graph一致,只要确保类型在容器中正确注册,即可通过构造函数获取ILogger实例。
内容的提问来源于stack exchange,提问作者Kyle Vanderstoep
相关产品推荐
相关产品推荐

