我该如何处理DDD的配置?

时间:2017-03-19 14:00:46

标签: domain-driven-design

实际上我正在使用日期范围,并且在某个时间每天都应该锁定当天的修改。所以在那之后,我不应该为实际的日子添加任务,只是为了第二天。此锁定时间应存储在配置中,我应该能够在管理设置中更改它。

将此锁定时间注入任务计划程序的正确方法是什么?我应该添加配置存储库,还是应该通过调度程序的实例化注入它?配置应该是域的一部分吗?

2 个答案:

答案 0 :(得分:1)

锁定是业务规则的一部分。因此,它应被视为您的域服务的一部分。此锁定服务是一个业务功能,给定一组值,将确定是否允许添加或更新任务。

我可能会这样做:

public class LockdownService: ILockdownService{
     public LockdownService(ILockdownRepo lockDownRepo){
         ...
    }

    public bool isLock(){
         //do logic here
    }

    //replace object with your model representation
    public object GetLockdownTime(){
         ...
    }
}


public class TaskSchedulerService{
     public TaskSchedulerService(IUserRepo userRepo, ILockdownService lockDownSvc, ITaskRepo taskRepo){
             ...
     }

    public void ScheduleTask(userId, label, begin, end) {
            var user = userRepo.GetById(userId)
            var lockdownTime = lockDownSvc.GetLockdownTime()
            //do lockdown logic


            //create task if all business rules are satisfied
            taskRepo.ScheduleTask(user.userId, label, begin, end);
    }       
}

如果锁定服务需要任务信息,那么您还可以将任务仓库注入锁定服务构造函数。

希望能给你这个想法。

答案 1 :(得分:1)

锁定时间的概念应该是域模型的一部分,因为它是需要捕获的业务规则。

  

将此锁定时间注入任务计划程序的正确方法是什么?我应该添加配置存储库,还是应该通过调度程序的实例化注入它?

您已经考虑过将值传递给构造函数,但您也可以将其传递给方法调用本身。例如(摘自评论到alltej的答案):

user.ScheduleTask(label, begin, end, lockdownTime) {
    // check lockdownTime and decide whether to schedule the task 
}

然后您就可以使用它:

// taskSchedulingService.cs (ctor takes in a configRepo and userRepo)

public void ScheduleTask(userId, label, begin, end) {
    var user = userRepo.GetById(userId)
    var lockdownTime = configRepo.GetLockdownTime()
    user.ScheduleTask(label, begin, end, lockdownTime)
}
  

配置应该是域的一部分吗?

很难回答这个问题,这取决于域名。我默认为" no"因为它通常不是,但是也许你有一个完全与配置相关的域:)大多数时候你只是在应用程序启动时从数据库或文件中读取一些值并使用这些值来创建你的服务/对象。在这种情况下,配置本身不是域的一部分 - 域只需要值,即在您的场景中,域将具有lockdownTime概念,但不会关注它来自何处。