首先,我将向您展示在Autofac.Integrated.MVC中设计的RequestLifetimeHttpModule的源代码。这有助于我们保持每个http请求只启动一次实例。
internal class RequestLifetimeHttpModule : IHttpModule
{
// Gets the lifetime scope provider that should be notified when a HTTP request
// ends.
internal static ILifetimeScopeProvider LifetimeScopeProvider { get; private set; }
public void Init(HttpApplication context)
{
if (context == null)
throw new ArgumentNullException("context");
context.EndRequest += OnEndRequest;
}
public void Dispose()
{
}
public static void SetLifetimeScopeProvider(
ILifetimeScopeProvider lifetimeScopeProvider)
{
if (lifetimeScopeProvider == null)
throw new ArgumentNullException("lifetimeScopeProvider");
LifetimeScopeProvider = lifetimeScopeProvider;
}
static void OnEndRequest(object sender, EventArgs e)
{
if (LifetimeScopeProvider != null)
LifetimeScopeProvider.EndLifetimeScope();
}
}
}
ILifetimeScopeProvider
被设计为静态字段。那么线程安全吗?
当我的请求正在运行并且另一个请求在安全时间进入时。我认为
第二个请求将尝试替换静态ILifetimeScopeProvider
(因为它不是按实例而不是Class)。
答案 0 :(得分:0)
调用该方法的唯一位置是constructor of RequestLifetimeScopeProvider,而AutofacDependencyResolver只调用该方法。
正如您在第130行所看到的,这是以单例模式调用的,因此每次应用程序启动时都无法对其进行多次实例化。