0

使用我的 DDD 模型,我拥有托管特定用户故事并允许组织存储库/实体/域服务的应用程序服务 - 据我了解,这是域驱动设计分层的常见部分,如下所示:

DDD 层

我需要按定时计划调用应用程序服务,该计划是在从作业存储库获得的模型本身中定义的。对这篇文章的评论请提到让存储库返回 GetPendingJobs() 以及要运行的作业列表。

每个作业都需要一个 cron 作业字符串,并将调用一个应用程序服务(例如 SyncAccounts)。

我的问题是:

  1. 我知道我们可以在线程上轮询它,但是它会放在哪里,在实体域服务中,或者作为域模型外部的东西(可能是应用程序和表示之间的层)?

  2. 正如在返回 GetPendingJobs() 的作业存储库的评论中提到的,如果这是基于当前日期/时间,那么存储库是否有责任知道何时运行,或者作业实体(检查当前日期时间与它的 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 回答