域驱动设计中输入验证通用规则的位置是什么?

时间:2015-02-02 02:39:05

标签: domain-driven-design

我正在开发一个遵循领域驱动设计技术的系统,我的目标是捕获员工的时钟和时钟。一个要求是系统在给定的时间跨度内不允许同一雇员连续两个时钟。我的问题是这个规则在哪里更合适,我不认为它与一个实体有关,而是作为域实体之上的某种过程的规则。建议?

3 个答案:

答案 0 :(得分:2)

问题中的“一般规则”一词表示要求不足。

回答一个问题:“系统不能允许”是什么意思 - 它应该记录案例吗?拒绝保存数据?将报告发送给员工的经理?

域模型高度依赖于您建模的域的哪些方面。

通过答案,你将得到一个更清晰的模型,问题将不再过于主观。

根据要求,可能是:

  • employee的行为;
  • door的行为;
  • CorporateSecurity服务行为;
  • DSL中的事件处理程序;
  • 规则引擎中的规则;
  • 完全不同的东西。

编辑:如果允许输入哪些数据,那么它就是输入验证。有一个很好的方法描述in Martin Fowler's bliki - 一个对象可以validate()本身并返回一组验证错误。

答案 1 :(得分:1)

您可以拥有一个处理此问题的域名服务。您可以让应用程序层获取当天的所有时钟,并将其提供给域服务。或者,如果IRepository存在于您的域层中,则域服务可以请求时钟输入。

答案 2 :(得分:1)

假设此“规则”是您域中的实际不变量,您可能应该在域模型中维护时钟输入和输出信息?毕竟它听起来像你想要捕捉的行为。

作为旁注,请注意不要让数据库影响域模型的设计。考虑是否应用CRUD(创建,读取,更新和删除)方法或尝试对实际域建模是有帮助的。如果后者需要花时间发现各种有界的上下文,这将有助于您更有效地建模域。

我有一篇你可能会发现有用的帖子,它对可能有用的术语有一些宽松的定义,Aggregate Root – How to Build One for CQRS and Event Sourcing