2
我试图让一个事务ID用于在整个请求中进行日志记录。 Trasaction ID是AuditContext中的一个属性,每个请求都是单身。我在Global.asax.cs中有以下代码手动解析InstancePerRequest类型时未收到Autofac相同的注入实例
builder.RegisterType<AuditContext>().As<IAuditContext>().InstancePerRequest();
....
GlobalContainer = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(GlobalContainer);
事务ID在基类api类中设置。
public BaseApiController(IAuditContext auditContext, IDispatcher dispatcher = null)
{
auditContext.TransactionID = Guid.NewGuid().ToString();
}
具有正确事务标识的AuditContext对象被注入,在下面的构造函数注入用法中。
public class SapEventLogger : ISapEventLogger
{
private IAuditContext auditContext;
public SapEventLogger(IAuditContext auditContext)
{
this.auditContext = auditContext; //this auditContext object has correct transaction ID
}
}
如果有任何异常,我想检索事务ID并记录它。但是当我尝试手动解析时,我得到一个新的AuditContext对象,其中事务标识为空。
public class ServiceExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
using (var scope = GlobalContainer.BeginLifetimeScope(Autofac.Core.Lifetime.MatchingScopeLifetimeTags.RequestLifetimeScopeTag))
{
var auditContext = scope.Resolve<FDP.Services.Common.IAuditContext>();
transactionID = auditContext.TransactionID; //Transaction ID is null here
}
}
}
不确定为什么在手动解析AuditContext时创建新对象。我错过了什么吗?
谢谢@Travis!还有一个疑问。如果将AuditContext注册为InstancePerLifetimeScope,是否可以在ActionContext(请求)不可用的Web Api Controller范围之外手动解析它?如果解析不是Web API请求的一部分,则可以返回null。 – Baga
如果您可以获取终身范围所在的Web API请求消息,则表示您很好。如果你不能,你就卡住了。就这么简单。 –
哦,如果你注册了每个请求的实例并且在请求之外解析,你会得到一个异常,而不是null。 –