以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));
