2012-08-08 94 views
1

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

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

  • 难单元测试(例如,我要保证之前,我可以做任何事情的单身初始化)
  • 如果大量的就业机会扩大规模被称为
  • 与同时在单例类上调用多个方法相关的线程安全问题。

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

回答

1

您可能想要考虑实施将服务层对象注入作业的自定义作业工厂。现在已经有了最流行的DI容器的自定义工厂的实现,所以你可以选择其中的一个或者建立你自己的。这将允许您在每次创建作业时传递对服务层对象的引用,并应该帮助进行单元测试。它也将解决单身问题。

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

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

+0

这听起来像没有办法做到这一点,而不使用依赖注入? – sdbol 2012-08-12 11:47:14

+0

是否将服务层转换为类似Web服务的选项?那么你只需要传递给它的URL。除此之外,我认为DI是要走的路。 – jvilalta 2012-08-12 18:22:53