为什么存储库不应该返回 DTO

阅读了很多人们说我应该返回领域模型的文章……但这会破坏我存储库的整个想法。

我正在使用 laravel Eloquent 模型(如果我是正确的话 - 域模型)。我有存储库,所以如果我决定切换到 Doctrine,我可以在服务提供商中全部交换。但是,如果我将返回一个域模型实例(在本例中为 Eloquent 模型),那将毫无意义。我需要从存储库返回相同的结果,而 DTO 似乎正是我所需要的......

有人可以解释我为什么错了吗?


慕少森
浏览 96回答 1
1回答

qq_花开花谢_0

什么是什么首先,我想对您使用的术语进行解释。DTO(数据传输对象)通常是具有公共属性的 PHP 类只负责承载数据不不验证数据不知道任何特定于实现的事情(例如它绑定到哪个 ORM)通常用于在应用程序的各个部分之间传递数据,而任何一部分都不知道另一部分的实现领域模型通常是具有私有属性的 PHP 类应该只包含有效数据验证任何更改都会导致有效状态不知道任何特定于实现的事情(例如它绑定到哪个 ORM)资料库只负责存储和检索数据知道它的实现(例如它绑定到哪个 ORM)不负责返回有效数据这对您的情况意味着什么答案实际上取决于您在分担责任方面的想法有多纯粹。如果您与纯粹主义者交谈,他们会说 Eloquent 模型不是 DTO,它们也不是域模型。存储库将返回一个雄辩的模型,该模型将映射到域模型。然后可以修改该域模型或将其转换为可用于读取数据的 DTO。在这种情况下,职责以拥有更多代码为代价被分离。如果您与实用主义者交谈,他们会说 Eloquent 模型是 DTO 和域模型(有时甚至是存储库)。由于 Eloquent 模型负责存储数据、检索数据、修改数据并将此数据传递给应用程序的其他部分。最后,一切都与偏好有关。你可以纯粹,你可以务实,你甚至可以在两者之间做出选择。这完全取决于你是一个多么先进的编码器,项目有多大,它应该如何维护,必须进行多快的更改等。时间差存储库可以返回 DTO 或域模型,具体取决于您在分离职责方面的想法。
打开App,查看更多内容
随时随地看视频慕课网APP