手动解析InstancePerRequest类型时,未收到Autofac相同的注入实例

时间:2016-11-09 13:06:20

标签: c# .net dependency-injection autofac

我试图拥有一个事务ID,用于记录整个请求。 Trasaction ID是AuditContext中的一个属性,而每个请求都是一个单例。我在Global.asax.cs

中有以下代码
<html>
<head>
    <title>Text</title>
</head>

<body>

    <div id="uname">
        //username related code


        <a href="#password"><div id="hello">Next</div></a>
    </div>


    <div id="password" style="display:none">
        //username related code


        <div id="final">Submit</div>
    </div>

    <script>

        window.onload=function(){

                window.addEventListener("hashchange", function(){                                               //this is the trick
                        console.log("Hash changed to", window.location.hash);

                        if(window.location.hash=="password")
                            //show password related div
                        else
                            //show username related div
                    });
            }

    </script>
</body>

交易ID在基础api类中设置。

builder.RegisterType<AuditContext>().As<IAuditContext>().InstancePerRequest();
....
GlobalContainer = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(GlobalContainer);

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

public BaseApiController(IAuditContext auditContext, IDispatcher dispatcher = null)
{  
    auditContext.TransactionID = Guid.NewGuid().ToString();
}

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

public class SapEventLogger : ISapEventLogger
{        
    private IAuditContext auditContext;        

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

}

在手动解析AuditContext时,不确定为什么会创建新对象。我错过了什么吗?

1 个答案:

答案 0 :(得分: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();