这个线程对RequestLifetimeHttpModule是安全的:ILifetimeScopeProvider

时间:2014-11-18 05:26:14

标签: asp.net-mvc dependency-injection autofac

首先,我将向您展示在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)。

1 个答案:

答案 0 :(得分:0)

调用该方法的唯一位置是constructor of RequestLifetimeScopeProvider,而AutofacDependencyResolver只调用该方法。

正如您在第130行所看到的,这是以单例模式调用的,因此每次应用程序启动时都无法对其进行多次实例化。