Autofac和Quartz.Net集成

Dav*_*vre 15 autofac quartz.net

有没有人有任何集成autofacQuartz.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是,InstancePerLifetimeScopeInstancePerDependency将被创建并与一起被毁坏了Owned实例.

  • 我不知道Owned创造了一个范围; 很有用.我认为这可能是最直接的方法,然而没有深入了解Quartz堆栈.我可能会增加我的`IJobFactory`,如果作业不属于`JobWrapper <>`那么就是这样(只是让我晚上睡得好一点......).再次感谢您的洞察力. (3认同)