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

回答

0

通过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(); 
+0

谢谢@Travis!还有一个疑问。如果将AuditContext注册为InstancePerLifetimeScope,是否可以在ActionContext(请求)不可用的Web Api Controller范围之外手动解析它?如果解析不是Web API请求的一部分,则可以返回null。 – Baga

+0

如果您可以获取终身范围所在的Web API请求消息,则表示您很好。如果你不能,你就卡住了。就这么简单。 –

+0

哦,如果你注册了每个请求的实例并且在请求之外解析,你会得到一个异常,而不是null。 –

相关问题