gpt4 book ai didi

c# - 手动解析 InstancePerRequest 类型时未收到 Autofac 相同的注入(inject)实例

转载 作者:太空宇宙 更新时间:2023-11-03 15:12:26 26 4
gpt4 key购买 nike

我正在尝试获得一个事务 ID,它将用于在整个请求过程中进行日志记录。交易 ID 是 AuditContext 中的一个属性,而每个请求又是一个单例。我在 Global.asax.cs 中有以下代码

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();
}

在下面的构造函数注入(inject)用法中注入(inject)具有正确事务 ID 的 AuditContext 对象。

public class SapEventLogger : ISapEventLogger
{
private IAuditContext auditContext;

public SapEventLogger(IAuditContext auditContext)
{
this.auditContext = auditContext; //this auditContext object has correct transaction ID
}

}

如果出现任何异常,我想检索交易 ID 并将其记录下来。但是当我尝试手动解析时,我得到一个新的 AuditContext 对象,其中事务 ID 为空。

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 时创建新对象。我错过了什么吗?

最佳答案

通过 BeginLifetimeScope 调用,您可以手动创建第二个 请求生命周期,而不是使用现有的请求生命周期。两个请求生命周期等于两个实例。

The solution to this is outlined in the Autofac docs in more detail但简短的版本是从处理程序上下文中的请求消息中获取请求生命周期:

// Get the request lifetime scope so you can resolve services.
var requestScope = context.Request.GetDependencyScope();

// Resolve the service you want to use.
var auditContext = requestScope.GetService(typeof(IAuditContext)) as IAuditContext;

// Do the rest of the work in the filter.
auditContext.DoWork();

关于c# - 手动解析 InstancePerRequest 类型时未收到 Autofac 相同的注入(inject)实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com