【问题标题】:Entry point for DDD application service call which should be called on a timer应在计时器上调用的 DDD 应用程序服务调用的入口点
【发布时间】:2013-02-12 12:09:11
【问题描述】:

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

【问题讨论】:

  • 我会拥有GetAllPendingJobs,它只会返回那些应该运行的人。但我看不出这与 DDD 有什么关系?
  • 感谢您的回复——我认为这与域驱动器设计有很大关系……尤其是我们如何将应用层与模型接口。此外,您是否希望存储库知道何时应该运行作业(基于日期/时间)?知道何时运行不是作业的责任吗?

标签: design-patterns domain-driven-design


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

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

【讨论】:

  • 请原谅我的小评论,但“在应用层”不是层。 Tier 是某种部署单元,Udi wrote 关于这个。
猜你喜欢
  • 2011-09-29
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多