【问题标题】:Quartz .NET job execution to call existing class methodQuartz .NET 作业执行以调用现有的类方法
【发布时间】:2012-08-08 01:05:19
【问题描述】:

我有一个现有的 C# ASP.NET 应用程序,它带有一个用户界面和各种按钮来启动操作。这些动作对一个单例类进行同步方法调用,我将调用这个类ServiceLayer。这一层还初始化了一个数据模型。

我想将 UI 中的一些操作安排在一天中的特定时间发生。我相信 Quartz.NET 提供了我需要的所有必要功能。我可以从每个 Job 类(即实现 IJob 接口的类)的 Execute(IJobExecutionContext context) 中成功调用单例类 ServiceLayer 上的方法。但是,出于以下几个原因,我不喜欢使用这种方法:

  • 难以进行单元测试(例如,我必须确保在执行任何操作之前初始化单例)
  • 如果调用许多作业,则扩大规模
  • 同时在单例类上调用多个方法相关的线程安全问题。

我的问题是处理这种情况而不是直接在单例上调用方法的最佳设计模式是什么?我相信我需要以某种方式使用 JobDataMap 但我不确定如何。我应该关注生产者-消费者还是排队方式?

【问题讨论】:

    标签: c# quartz.net


    【解决方案1】:

    您可能需要考虑实现一个自定义作业工厂,将您的服务层对象注入到作业中。已经有针对最流行的 DI 容器的自定义工厂的实现,因此您可以使用其中之一或构建自己的工厂。这将允许您在每次创建作业时传递对服务层对象的引用,并且应该有助于单元测试。它还可以解决单例问题。

    就扩展而言,您可以使用 JobDataMap 传递连接字符串或服务器名称等内容,从而允许您在服务器之间进行负载平衡或分配工作。

    这里有一些 posts 描述了自定义作业工厂方法,如果你最终走上了这条路。

    【讨论】:

    • 听起来好像不使用依赖注入就没有办法做到这一点?
    • 是否可以选择将服务层转换为 Web 服务之类的东西?然后,您只需将 url 传递给它。除此之外,我认为 DI 是要走的路。
    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多