2011-02-05 68 views
12

有没有人有任何经验积分autofacQuartz.Net?如果是这样,那么最好在哪里最好控制生命周期管理 - IJobFactory,在IJob的执行中,还是通过事件监听器?Autofac和Quartz.Net集成


现在,我使用的是自定义的autofac IJobFactory创建IJob实例,但我没有一个简单的方法来插入到ILifetimeScope在IJobFactory确保注入任何昂贵的资源在IJob被清理。作业工厂只是创建一个作业的实例并将其返回。这里是我的想法电流(希望有更好的...)

  • 它看起来像最AutoFac集成莫名其妙地裹ILifetimeScope围绕他们所创造的工作单元。明显的蛮力的方式似乎是通过ILifetimeScopeIJob,并有Execute方法创建一个孩子ILifetimeScope并实例化任何依赖关系。这似乎与服务定位器模式有点太接近了,这反过来似乎违背了autofac的精神,但它可能是确保正确处理范围的最明显的方式。

  • 我可以插入一些Quartz事件来处理Job执行堆栈的不同阶段,并处理那里的生命周期管理。这可能会做更多的工作,但如果它能更清晰地分离问题,可能值得。

  • 确保一个IJob是围绕IServiceComponent型,这将做好各项工作的简单包装,并要求其为Owned<T>,或Func<Owned<T>>。我喜欢这个看起来更像autofac,但我不喜欢它对于IJob的所有实现者都不是严格可执行的。

回答

12

不知道太多关于Quartz.Net和IJob s,我会冒险的建议仍然。

考虑以下工作包装:

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(); 
     } 
    } 
} 

鉴于以下注册:

builder.RegisterGeneric(typeof(JobWrapper<>)); 
builder.RegisterType<SomeJob>(); 

作业工厂现在能够解决这个包装:

var job = _container.Resolve<JobWrapper<SomeJob>>(); 

注:lifetime scope将成为cre作为ownedJob实例的一部分,在这种情况下其类型为Owned<SomeJob>SomeJob所需的任何依赖项即InstancePerLifetimeScopeInstancePerDependency将与Owned实例一起创建和销毁。

+0

感谢您抽出时间回复。我喜欢这个想法,因为它是原始问题中我的第三次头脑风暴的更加明确的版本。还有什么让我感到困惑的是,我无法控制一生的范围。基本上,我想在自己的LifetimeScope中运行每个IJob,几乎就像WCF服务调用的等价物。不幸的是Quartz`IJobFactory`非常火,忘记了我所能说的,所以如果我真的想要明确的范围边界,我不得不深入Quartz监听器系统。 – 2011-02-07 20:08:41