Dav*_*vre 15 autofac quartz.net
有没有人有任何集成autofac和Quartz.Net的经验?如果是这样,哪里最好控制生命周期管理--IJobFactory,在IJob的执行中,或通过事件监听器?
现在,我正在使用自定义autofac IJobFactory来创建IJob实例,但我没有一种简单的方法来插入ILifetimeScopeIJobFactory中的a,以确保清除IJob中注入的任何昂贵资源.作业工厂只创建一个作业实例并将其返回.以下是我目前的想法(希望有更好的想法...)
看起来大多数AutoFac集成以某种方式包裹ILifetimeScope着他们创建的工作单元.显而易见的蛮力方式似乎是传递ILifetimeScope进入IJob并让Execute方法创建一个子进程ILifetimeScope并在那里实例化任何依赖.这似乎与服务定位器模式有点过于接近,这反过来似乎违背了autofac的精神,但它可能是确保正确处理范围的最明显的方法.
我可以插入一些Quartz事件来处理Job执行堆栈的不同阶段,并在那里处理生命周期管理.这可能会有更多的工作,但如果它能够更清晰地分离关注点,那么可能是值得的.
确保IJob是一个IServiceComponent类型的简单包装器,它可以完成所有工作,并将其作为Owned<T>或者请求Func<Owned<T>>.我喜欢这样看起来更像autofac,但我不喜欢它对IJob的所有实现者都不是严格可执行的.
Pet*_*old 12
在不了解Quartz.Net和IJobs的情况下,我还会冒险提出一个建议.
考虑以下Job包装器:
public class JobWrapper<T>: IJob where T:IJob
{
private Func<Owned<T>> _jobFactory;
public JobWrapper(Func<Owned<T>> jobFactory)
{
_jobFactory = jobFactory;
}
void IJob.Execute()
{
using (var ownedJob = _jobFactory())
{
var theJob = ownedJob.Value;
theJob.Execute();
}
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于以下注册:
builder.RegisterGeneric(typeof(JobWrapper<>));
builder.RegisterType<SomeJob>();
Run Code Online (Sandbox Code Playgroud)
作业工厂现在可以解析此包装器:
var job = _container.Resolve<JobWrapper<SomeJob>>();
Run Code Online (Sandbox Code Playgroud)
注意:一个寿命范围会随着的一部分来创建ownedJob实例,它在此情况下是类型的Owned<SomeJob>.通过所需的任何依赖关系SomeJob是,InstancePerLifetimeScope或InstancePerDependency将被创建并与一起被毁坏了Owned实例.
看看https://github.com/alphacloud/Autofac.Extras.Quartz。它还可以作为 NuGet 包https://www.nuget.org/packages/Autofac.Extras.Quartz/提供
我知道的有点晚了:)
| 归档时间: |
|
| 查看次数: |
6970 次 |
| 最近记录: |