Autofac.Integration.Mvc分析

Autofac.Integration.Mvc

static ILifetimeScope LifetimeScope
        {
            get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; }
            set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; }
        }
namespace Autofac.Integration.Mvc
{
    /// <summary>
    /// An <see cref="IHttpModule"/> and <see cref="ILifetimeScopeProvider"/> implementation 
    /// that creates a nested lifetime scope for each HTTP request.
    /// </summary>
    internal class RequestLifetimeHttpModule : IHttpModule
    {
        /// <summary>
        /// Gets the lifetime scope provider that should be notified when a HTTP request ends.
        /// </summary>
        internal static ILifetimeScopeProvider LifetimeScopeProvider { get; private set; }

        /// <summary>
        /// Initializes a module and prepares it to handle requests.
        /// </summary>
        /// <param name="context">An <see cref="T:System.Web.HttpApplication"/> that provides access to the 
        /// methods, properties, and events common to all application objects within an ASP.NET application</param>
        /// <exception cref="System.ArgumentNullException">
        /// Thrown if <paramref name="context" /> is <see langword="null" />.
        /// </exception>
        public void Init(HttpApplication context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            context.EndRequest += OnEndRequest;
        }

        /// <summary>
        /// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
        /// </summary>
        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();
        }
    }
}
using System.ComponentModel;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;

namespace Autofac.Integration.Mvc
{
    /// <summary>
    /// Container class for the ASP.NET application startup method.
    /// </summary>
    [EditorBrowsable(EditorBrowsableState.Never)]
    public static class PreApplicationStartCode
    {
        private static bool _startWasCalled;

        /// <summary>
        /// Performs ASP.NET application startup logic early in the pipeline.
        /// </summary>
        public static void Start()
        {
            // Guard against multiple calls. All Start calls are made on the same thread, so no lock needed here.
            if (_startWasCalled) return;

            _startWasCalled = true;
            DynamicModuleUtility.RegisterModule(typeof(RequestLifetimeHttpModule));
        }
    }
}
原文地址:https://www.cnblogs.com/shiningrise/p/5568879.html