[译]仓储 - 《Domain-Driven Design in PHP》第10章
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
为了与领域对象进行交互,你需要持有该对象的引用。实现这样的一种方式是通过创建对象来实现。或者,你可以贯穿关联,在面向对象编程中,对象持有与其他对象的引用,这使它们贯穿,从而有助于我们的模型的展现。但是,你需要有一种机制来获取第一个对象:聚合根。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
为了与领域对象进行交互,你需要持有该对象的引用。实现这样的一种方式是通过创建对象来实现。或者,你可以贯穿关联,在面向对象编程中,对象持有与其他对象的引用,这使它们贯穿,从而有助于我们的模型的展现。但是,你需要有一种机制来获取第一个对象:聚合根。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
工厂是一个强有力的抽象。它们帮助客户端从如何与领域交互的细节中解耦出来。客户端不需要知道如何去构建一个复杂的对象和聚合,所以你可以使用工厂来创建整个聚合,从而让其具有不变性。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
聚合可能是领域驱动设计中最困难的构建块。它们很难理解,甚至难以正确设计。但是不用担心,我们在这里给你提供帮助。在进入聚合之前,我们需要先了解一些关键概念:事务和并发策略。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
我们已经讨论了先尝试将领域中的所有东西构建为Value Object的好处。但是当领域建模时,可能你会遇到这样的情况,通用语言中的一些概念需要有一些Identiy。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
你已经了解了实体和值对象了。作为基本构建块,他们应该包含了任何应用的大部分业务逻辑。但是,在一些场景中值对象和实体并不是一个最好的解决方案。让我们看一下Eric Evans在他的《Domain-Driven Design: Tackling Complexity in the Heart of Software:》书中说的话:
当领域中的一个重要过程或转化不是实体或者值对象的自然职责时,增加一个操作作为一个单独的接口,此时该接口被声明为Service领域服务。根据模型的通用语言定义接口,并确保名称是通用语言中的一部分,是服务成为无状态。
本篇博文由本博客(
http://www.veitor.net)经原文翻译,转载请注明出处。
通过使用self关键字,我们不会将”值对象”作为领域驱动设计的基本构建块,而是在代码中将它们作为你通用语言的概念。一个值对象在你的领域中不仅仅是一个东西,它能够度量、量化或者描述一些信息。值对象可以看作是小的简单对象(如金钱或者日期范围),它们不像实体(Entity)通过身份标识来进行区分,而是根据其所持有的内容来做区分。
CQRS/ES下,许多开发者不了解如何在系统中处理这样的场景:
在用户创建的时候,我们想要去验证用户名在数据库中是否是唯一的。我应该使用
Event Store还是使用读数据库查询?我该在哪执行这个查询?
这个问题是StackOverflow上与CQRS话题有关的最受关注的话题。因此在这篇文章中,我们将尝试针对这个问题寻找出最佳解决方案。