DDD应用程序服务调用的入口点,应在计时器上调用

时间:2013-02-12 12:09:11

标签: design-patterns domain-driven-design

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

DDD layers

我需要按照定时计划调用应用程序服务,此计划在从作业存储库获取的模型本身中定义。有关这篇文章的评论,请提到存储库返回GetPendingJobs(),其中包含要运行的作业列表。

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

我的问题是:

  1. 我知道我们可以在一个线程上对此进行轮询,但这会在实体域服务中占据什么位置,或者作为域模型外部的东西(可能是应用程序和表示之间的层)?

  2. 正如在job存储库返回GetPendingJobs()的注释中所提到的,如果这是基于当前日期/时间,则存储库有责任知道何时运行,或者是Job实体(检查当前日期时间与其cronjob字符串)?

  3. 以下代码:

    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();      
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

  1. 此逻辑是一个操作问题,因此属于应用程序层。然而,这可以根据作业的性质以各种方式实现。这些工作是否需要在自己的流程中运行?如果是这样,那么你可能想要使用Windows服务进行托管。如果作业可以作为主应用程序进程的一部分运行,则运行器本身可以作为后台应用程序服务。

  2. GetPendingJobs方法可以根据当前或提供的时间返回作业,在这种情况下,它有效地知道哪些作业必须运行。但是,规范信息与作业本身相关联 - 存储库只是查询它。