0

私の DDD モデルでは、特定のユーザー ストーリーをホストし、リポジトリ/エンティティ/ドメイン サービスを整理できるようにするアプリケーション サービスがあります。

DDDレイヤー

時間指定されたスケジュールでアプリケーション サービスを呼び出す必要があります。このスケジュールは、ジョブ リポジトリから取得したモデル自体で定義されています。この投稿へのコメントでは、実行するジョブのリストを含むリポジトリが GetPendingJobs() を返すように親切に言及されています。

各ジョブは cron ジョブ文字列を受け取り、アプリケーション サービス (SyncAccounts など) を呼び出します。

私の質問は次のとおりです。

  1. これをスレッドでポーリングできることはわかっていますが、エンティティ ドメイン サービスのどこに配置するか、またはドメイン モデルの外部 (おそらくアプリケーションとプレゼンテーションの間のレイヤー) として配置するのでしょうか?

  2. GetPendingJobs() を返すジョブ リポジトリのコメントで述べたように、これが現在の日付/時刻に基づいている場合、いつ実行するかを知るのはリポジトリの責任ですか、それとも Job エンティティの責任ですか (現在の日付時刻をそのcronjob文字列)?

以下のコード:

namespace DomainServices
{
    public class JobSchedule
    {
        private readonly JobsRepository repo;

        JobSchedule(JobsRepository repo)
        {
            this.repo = repo;
        }

        public void Poll()
        {
            var jobs = this.repo.GetAllJobs();

            foreach(var job in jobs)
            {
                if(job.IsTimeToRun())
                    job.Run();      
            }
        }
    }
}
4

1 に答える 1

1
  1. このロジックは運用上の問題であるため、アプリケーション層に属します。ただし、これはジョブの性質に応じてさまざまな方法で実装できます。ジョブは独自のプロセスで実行する必要がありますか? その場合は、ホスティング用の Windows サービスを使用することをお勧めします。ジョブをメイン アプリケーション プロセスの一部として実行できる場合、ランナー自体をバックグラウンド アプリケーション サービスにすることができます。

  2. このGetPendingJobsメソッドは、現在の時刻または指定された時刻に基づいてジョブを返すことができます。この場合、どのジョブをいつ実行する必要があるかが効果的にわかります。ただし、正規情報はジョブ自体に関連付けられています。リポジトリはそれを照会するだけです。

于 2013-02-12T17:45:25.580 に答える