gpt4 book ai didi

Autofac 和 Quartz.Net 集成

转载 作者:行者123 更新时间:2023-12-03 20:43:09 26 4
gpt4 key购买 nike

有谁有集成的经验吗?自动法 quartz 网 ?如果是这样,最好在哪里控制生命周期管理 - IJobFactory,在 IJob 的执行中,还是通过事件监听器?

现在,我正在使用自定义 autofac IJobFactory创建 IJob实例,但我没有一个简单的方法来插入 ILifetimeScope在 IJobFactory 中确保清除在 IJob 中注入(inject)的任何昂贵资源。作业工厂只是创建一个作业实例并返回它。这是我目前的想法(希望有更好的想法......)

  • 看起来大多数 AutoFac 集成以某种方式包装了 ILifetimeScope围绕他们创建的工作单元。明显的蛮力方式似乎是通过 ILifetimeScope进入IJob并拥有 Execute方法创建一个 child ILifetimeScope并在那里实例化任何依赖项。这似乎有点过于接近服务定位器模式,这反过来又似乎违背了 autofac 的精神,但它可能是确保正确处理范围的最明显方法。
  • 我可以插入一些 Quartz 事件来处理作业执行堆栈的不同阶段,并在那里处理生命周期管理。这可能需要做更多的工作,但如果它能够更清晰地分离关注点,那么它可能是值得的。
  • 确保 IJob 是 IServiceComponent 的简单包装器。类型,它将完成所有工作,并将其请求为 Owned<T> , 或 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>>();

    注:一个 lifetime scope将作为 ownedJob 的一部分创建实例,在本例中为 Owned<SomeJob> 类型. SomeJob 所需的任何依赖项即 InstancePerLifetimeScopeInstancePerDependency将与 Owned 一起创建和销毁实例。

    关于Autofac 和 Quartz.Net 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4910131/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com