Autofac.Integration.Web分析
using System; using System.Web; using Autofac.Core.Lifetime; namespace Autofac.Integration.Web { /// <summary> /// Provides application-wide and per-request containers. /// </summary> public class ContainerProvider : IContainerProvider { readonly IContainer _applicationContainer; readonly Action<ContainerBuilder> _requestLifetimeConfiguration; /// <summary> /// Initializes a new instance of the <see cref="ContainerProvider"/> class. /// </summary> /// <param name="applicationContainer">The application container.</param> public ContainerProvider(IContainer applicationContainer) { if (applicationContainer == null) throw new ArgumentNullException("applicationContainer"); _applicationContainer = applicationContainer; } /// <summary> /// Initializes a new instance of the <see cref="ContainerProvider"/> class. /// </summary> /// <param name="applicationContainer">The application container.</param> /// <param name="requestLifetimeConfiguration">An action that will be executed when building /// the per-request lifetime. The components visible within the request can be /// customised here.</param> public ContainerProvider(IContainer applicationContainer, Action<ContainerBuilder> requestLifetimeConfiguration) : this(applicationContainer) { if (requestLifetimeConfiguration == null) throw new ArgumentNullException("requestLifetimeConfiguration"); _requestLifetimeConfiguration = requestLifetimeConfiguration; } /// <summary> /// Dispose of the current request's container, if it has been /// instantiated. /// </summary> public void EndRequestLifetime() { var rc = AmbientRequestLifetime; if (rc != null) rc.Dispose(); } /// <summary> /// The global, application-wide container. /// </summary> /// <value></value> public ILifetimeScope ApplicationContainer { get { return _applicationContainer; } } /// <summary> /// The container used to manage components for processing the /// current request. /// </summary> /// <value></value> public ILifetimeScope RequestLifetime { get { var result = AmbientRequestLifetime; if (result == null) { result = _requestLifetimeConfiguration == null ? ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag) : ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag, _requestLifetimeConfiguration); AmbientRequestLifetime = result; } return result; } } static ILifetimeScope AmbientRequestLifetime { get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; } set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; } } } }
/// <summary> /// The container used to manage components for processing the /// current request. /// </summary> /// <value></value> public ILifetimeScope RequestLifetime { get { var result = AmbientRequestLifetime; if (result == null) { result = _requestLifetimeConfiguration == null ? ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag) : ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag, _requestLifetimeConfiguration); AmbientRequestLifetime = result; } return result; } } static ILifetimeScope AmbientRequestLifetime { get { return (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)]; } set { HttpContext.Current.Items[typeof(ILifetimeScope)] = value; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)