如何解决确保使用2个属性组合仅创建一个obj的DDD方法是什么
对于整个DDD概念来说还很新,我有以下问题:
让我们说我有一个UI,用户可以在其中输入ID和名称来节省汽车。确保唯一标识和名称组合仅创建一次的DDD方法是什么?这些汽车都是实体,将存储在数据库中。通常我只需要在数据库中放入一个主键和一个foriegn键,然后检查是否已经存在该组合,如果没有创建/存储obj,是否存在相同的组合就不会。
现在我在想这是领域逻辑还是简单的CRUD。如果这是领域逻辑,并且如果我没有正确理解,我应该让我的汽车对象决定它是否有效。如果是这样,我该怎么办?
提前谢谢!
编辑:
另一件事:如果应在10天后删除每个创建的对象,该怎么办。那将是领域中的一个概念,因此也是领域逻辑的一部分。但是对象应该如何知道何时删除自身以及应该如何删除呢?那将是一个检查对象创建日期的域服务,如果它早于10天,则应在数据库内部执行删除操作?
解决方法
如果您不关心输入值的有效性,我会在2个字段上使用UNIQUE约束。这样,即使有人出于某些原因直接在数据库中插入/更新记录,数据库也会阻止它。
如果您关心输入的合并值的有效性,那么在将其保存到数据库之前,您必须在代码中添加一些逻辑。
关于删除机制,您可以有一个调度程序,通过检查先前填充的DB列(例如CREATED_ON)并每天删除,每天检查10天以上的数据。
,“取决于”。
如果id
和name
是在对象生存期开始时分配的不可变属性,那么直接要做的就是将它们合并到用于查找聚合的键中
car = Garage.get(id,name)
相反,如果您所拥有的关系随时间而变化(例如,如果您不得不担心name
被数据输入错误损坏),那么事情就变得更加复杂。
您所描述的问题的总称是set-validation。谜语是这样的:为了可靠地验证某个集合具有某些属性,您需要知道该属性在您进行检查和提交自己的更改之间没有改变。换句话说,您需要能够锁定整个集合。
更一般地说,集合是关联对象的集合,出于数据更改的目的,我们将其视为一个单元。我们为该模式命名: aggregate 。
因此“名称注册表”本身就是一个汇总-您可以加载,修改,存储等等。
在某些情况下,将其划分为较小的聚合(“称为Bob的事物集”)是有意义的-减少了管理聚合本身时需要加载/存储的数据量,但增加了一些复杂性更改名称时的用例。
这比仅使用数据库约束的答案更好吗?这取决于您在权衡的哪一方面会更重视-在域模型中强制执行部分不变式,而在数据存储中实施则将增加复杂性。另外,当您开始依靠数据存储来强制执行部分不变式时,就会开始限制使用哪种数据存储的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。