1

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

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

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

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

4

1 回答 1

1

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

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

如果您最终走这条路,这里有一些描述自定义作业工厂方法的帖子。

于 2012-08-09T15:23:10.300 回答