有没有人有整合经验autofac and 石英网?如果是这样,最好在哪里控制生命周期管理——IJobFactory、IJob 的执行中还是通过事件侦听器?
现在,我正在使用自定义 autofacIJobFactory
来创建IJob
实例,但我没有一种简单的方法来插入ILifetimeScope
在 IJobFactory 中,以确保清除注入 IJob 中的所有昂贵资源。作业工厂只是创建一个作业实例并返回它。这是我目前的想法(希望有更好的......)
看起来大多数 AutoFac 集成都以某种方式包装了ILifetimeScope
围绕他们创建的工作单元。明显的暴力方式似乎是通过ILifetimeScope
进入IJob
并拥有Execute
方法创建一个孩子ILifetimeScope
并在那里实例化任何依赖项。这似乎有点太接近服务定位器模式,这反过来似乎违背了 autofac 的精神,但它可能是确保正确处理作用域的最明显的方法。
我可以插入一些 Quartz 事件来处理作业执行堆栈的不同阶段,并在那里处理生命周期管理。这可能需要做更多的工作,但如果能够更清晰地分离关注点,那么这可能是值得的。
确保 IJob 是一个简单的包装器IServiceComponent
type,它将完成所有工作,并请求它作为Owned<T>
, or Func<Owned<T>>
。我喜欢 autofac 的感觉,但我不喜欢它对于 IJob 的所有实现者来说不是严格执行的。
不太了解 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>>();
Note: a 生命周期范围 http://code.google.com/p/autofac/wiki/OwnedInstances将被创建为ownedJob
实例,在本例中是类型Owned<SomeJob>
。所需的任何依赖项SomeJob
那是InstancePerLifetimeScope
or InstancePerDependency
将随着创建和销毁Owned
实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)