在Hangfire JobFilter取得当前Job LifetimeScope

以Autofac为例

建立自订的排程 JobActivator

GetChildScope() 建立新的子生命週期写入私有栏位,并返回

    /// <summary>    /// 排程Ioc容器解析器    /// </summary>    public class ContainerJobActivator : JobActivator    {        /// <summary>        /// 父容器        /// </summary>        public readonly IContainer Container;        /// <summary>        /// 容器物件子生命週期        /// </summary>        [ThreadStatic]        private static ILifetimeScope ChildScope;        /// <summary>        /// 建构式        /// </summary>        /// <param name="container">父容器</param>        public ContainerJobActivator(IContainer container)        {            this.Container = container;        }        /// <summary>        /// 解析物件为实体        /// </summary>        /// <param name="jobType">物件类型</param>        /// <returns>物件实体</returns>        public override object ActivateJob(Type jobType)        {            return ChildScope.Resolve(jobType);        }        /// <summary>        /// 取得容器物件子生命週期        /// </summary>        /// <returns>容器物件子生命週期</returns>        public ILifetimeScope GetChildScope()        {            ChildScope = Container.BeginLifetimeScope();            return ChildScope;        }        /// <summary>        /// 释放容器物件子生命週期        /// </summary>        public void DisposeChildScope()        {            ChildScope.Dispose();            ChildScope = null;        }    }

建立自订排程Filter

建构式传入建立好的 JobActivator 实体

this.ContainerJobActivator.GetChildScope(),取出当前排程之LifetimeScope()

 /// <summary>    /// 排程讯息推播注册    /// </summary>    public class ObserverJobFilterAttribute : JobFilterAttribute, IServerFilter    {        /// <summary>        /// 排程Ioc容器解析物件        /// </summary>        private readonly ContainerJobActivator ContainerJobActivator;        /// <summary>        /// 建构式        /// </summary>        /// <param name="container">排程Ioc容器</param>        public ObserverJobFilterAttribute(ContainerJobActivator container)        {            this.ContainerJobActivator = container;        }        /// <summary>        /// 排程处理结束事件        /// </summary>        /// <param name="filterContext">filterContext</param>        public void OnPerformed(PerformedContext filterContext)        {            this.ContainerJobActivator.DisposeChildScope();        }        /// <summary>        /// 排程处理开始事件        /// </summary>        /// <param name="filterContext">filterContext</param>        public void OnPerforming(PerformingContext filterContext)        {            ILifetimeScope currentLifetimeScope = this.ContainerJobActivator.GetChildScope();        }    }

将hangfire纳入autofac管理

选用自订的容器解析器 containerJobActivator

加入filter

         GlobalConfiguration.Configuration.UseAutofacActivator(container);         ContainerJobActivator containerJobActivator = new ContainerJobActivator(container);         JobActivator.Current = containerJobActivator;         GlobalJobFilters.Filters.Add(new ObserverJobFilterAttribute(containerJobActivator));

http://img2.58codes.com/2024/emoticon02.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章