1

ユーザーインターフェイスとアクションを開始するためのさまざまなボタンを備えた既存のC#ASP.NETアプリケーションがあります。アクションは、シングルトンであるクラスに対して同期メソッド呼び出しを行います。このクラスをServiceLayerと呼びます。このレイヤーは、データモデルも初期化します。

UIからのアクションの一部を1日の特定の時間に発生するようにスケジュールしたいと思います。Quartz.NETは、これを行うために必要なすべての機能を提供していると思います。各Jobクラス(つまり、IJobインターフェイスを実装するクラス)のExecute(IJobExecutionContextコンテキスト)からシングルトンクラスServiceLayerのメソッドを正常に呼び出すことができます。ただし、いくつかの理由から、このアプローチを使用するのは好きではありません。

  • ユニットテストが難しい(たとえば、何かを行う前にシングルトンが初期化されていることを確認する必要がある)
  • 多くのジョブが呼び出された場合のスケールアップ
  • シングルトンクラスで複数のメソッドを同時に呼び出すことに関連するスレッドセーフの問題。

私の質問は、シングルトンでメソッドを直接呼び出すのではなく、このケースを処理するための最良のデザインパターンは何ですか?どういうわけかJobDataMapを利用する必要があると思いますが、その方法がわかりません。生産者/消費者アプローチまたはキューイングアプローチを検討する必要がありますか?

4

1 に答える 1

1

サービスレイヤーオブジェクトをジョブに挿入するカスタムジョブファクトリの実装を検討することをお勧めします。世の中で最も人気のあるDIコンテナ用のカスタムファクトリの実装がすでにあるので、それらの1つを使用するか、独自に構築することができます。これにより、ジョブを作成するたびにサービスレイヤーオブジェクトへの参照を渡すことができ、単体テストに役立ちます。また、シングルトンの問題も解決します。

スケールアップに関する限り、JobDataMapを使用して接続文字列やサーバー名などを渡すことができます。これにより、サーバー間で負荷分散や作業の分散を行うことができます。

あなたがその道を行くことになった場合のカスタムジョブファクトリーアプローチを説明するいくつかの投稿があります。

于 2012-08-09T15:23:10.300 に答える