使用我的DDD模型,我有应用程序服务,可以托管特定的用户故事,并允许组织存储库/实体/域服务 - 据我所知,这是域驱动设计分层的常见部分,如下所示:
我需要按照定时计划调用应用程序服务,此计划在从作业存储库获取的模型本身中定义。有关这篇文章的评论,请提到存储库返回GetPendingJobs(),其中包含要运行的作业列表。
每个作业都会获取一个cron作业字符串,并将调用应用程序服务(例如SyncAccounts)。
我的问题是:
我知道我们可以在一个线程上对此进行轮询,但这会在实体域服务中占据什么位置,或者作为域模型外部的东西(可能是应用程序和表示之间的层)?
正如在job存储库返回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();
}
}
}
}
答案 0 :(得分:1)
此逻辑是一个操作问题,因此属于应用程序层。然而,这可以根据作业的性质以各种方式实现。这些工作是否需要在自己的流程中运行?如果是这样,那么你可能想要使用Windows服务进行托管。如果作业可以作为主应用程序进程的一部分运行,则运行器本身可以作为后台应用程序服务。
GetPendingJobs
方法可以根据当前或提供的时间返回作业,在这种情况下,它有效地知道哪些作业必须运行。但是,规范信息与作业本身相关联 - 存储库只是查询它。