gpt4 book ai didi

zend-framework - 关于存储库的域驱动设计问题

转载 作者:行者123 更新时间:2023-12-02 07:41:54 25 4
gpt4 key购买 nike

我正在尝试实现 DDD,所以我创建了以下类
- 用户[领域模型]
- UserRepository [管理对象的中央工厂]
- UserMapper + UserDbTable [映射应用程序功能并提供 CRUD 实现的映射器]

我的第一个问题是,当模型需要与持久层通信时,它应该联系存储库还是映射器?我个人认为它应该询问将联系映射器并提供所需功能的存储库。

现在我的第二个担心是同一类的所有对象应该只有一个存储库,所以这意味着我将创建一个单例。但是如果我的应用程序有很多域模型(比如说 20 个),那么就会有 20 个单例。而且感觉不对。另一种选择是使用 DI(依赖注入(inject)),但我使用的框架 (Zend Framework 1.11) 不支持 DIC。

我的第三个

最佳答案

  • UserRepository [a central factory to manage the object(s)]

在 DDD 存储库中不是 Factory .存储库负责领域对象的生命中期和生命末期。工厂负责开始。从概念上讲,持久化和恢复发生在域对象的中期。

  • UserMapper + UserDbTable [A Mapper to map application functionality and provide the CRUD implementation]

这些类不属于领域层,这是数据访问。它们都将由存储库实现封装(或者如果您使用 ORM,则根本不存在)。

My first question is that when a model needs to communicate with thepersistent layer should it contact the Repository or the mapper?Personally I am thinking that it should ask the repository which willcontact the mapper and provide the required functionality.

模型不需要和持久层通信。事实上,您应该尽量使您的模型与持久性无关。从你的领域模型的角度来看,Repository 只是一个接口(interface)。该接口(interface)的实现属于不同的层——数据访问。稍后将在您的应用程序层中的某个位置注入(inject)实现。应用层知道持久性和事务。这是您可以实现 Unit Of Work 的地方模式(也不属于领域层)。

Now my second concern is that there should be only one repository for all the objects of same class, so that means I will be creating a singleton. But if my application has lots of domain models (lets say 20), then there will be 20 singletons.

首先你可以拥有more than one给定域对象的存储库。无论如何,这是大多数时候发生的事情,因为您想避免存储库界面上的“方法爆炸”。其次,单例存储库是一个坏主意,因为它将所有消费者耦合到一个单一的实现,除其他外,这会使单元测试变得困难。第三,拥有 20 个或更多存储库并没有错,事实上,您拥有的类越集中越好,请参阅 SRP .

更新:

我认为您混淆了常规工厂模式和 DDD 工厂。在 DDD 术语中,当对象从数据库中恢复时,它在概念上已经存在(即使它是内存中的新对象)。因此,存储库有责任持久化和恢复它。当复杂领域对象开始其生命时,DDD Factory 开始发挥作用——无论它是否是长期存在的对象(保存在数据库中)。

关于zend-framework - 关于存储库的域驱动设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10263111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com