Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD存储库:使用DAO进行分离?_Domain Driven Design_Repository Pattern_Dao - Fatal编程技术网

Domain driven design DDD存储库:使用DAO进行分离?

Domain driven design DDD存储库:使用DAO进行分离?,domain-driven-design,repository-pattern,dao,Domain Driven Design,Repository Pattern,Dao,关于它们在stackoverflow和整个web上的使用和布局存在争议。我对如何在存储库后面高效地实现数据访问抽象(例如数据库)感到困惑 我不是在使用ORM工具/框架,因为我想自己看看细节。目前,我正在使用DAO对象访问(mysql)数据库并提供业务对象(域对象)。数据库表中外键给出的关联将在相应对象的DAO中解析和加载(当前没有延迟加载)。因为我不想在业务逻辑中直接使用我的数据库DAO,所以我认为存储库是一个很好的进一步抽象。在存储库中实现诸如GetEmployeesByShopAndPosi

关于它们在stackoverflow和整个web上的使用和布局存在争议。我对如何在存储库后面高效地实现数据访问抽象(例如数据库)感到困惑

我不是在使用ORM工具/框架,因为我想自己看看细节。目前,我正在使用DAO对象访问(mysql)数据库并提供业务对象(域对象)。数据库表中外键给出的关联将在相应对象的DAO中解析和加载(当前没有延迟加载)。因为我不想在业务逻辑中直接使用我的数据库DAO,所以我认为存储库是一个很好的进一步抽象。在存储库中实现诸如GetEmployeesByShopAndPosition()之类的复杂查询时,我遇到了困难:我看到了两种实现这种查询的可能性:

  • 暴力:使用Employee DAO并将所有员工作为业务对象(包括关联的店铺/职位)从数据库加载到存储库的集合中。迭代收集并返回在给定店铺和职位工作的员工
  • 高效:实现一个数据库查询,将相关表连接起来,并在EmployeeDAO中只返回所需的EmployeeBy where子句
  • 第一种方法使用了存储库实际应该具有的收集性质,但似乎效率很低。第二种方法产生了一种新的方法,但效率要高得多

    我的问题是:

  • 在这里你更喜欢什么,或者在实践中是如何做到的
  • 我错了吗?存储库不应该与DAO一起使用,数据库相关的代码可以直接进入存储库
  • 当存储库处理聚合时,它是否应该实际组装相关的外键来构建(完整的)业务对象,而不是我当前使用的DAO

  • 我知道这个主题不是黑/白的,因为涉及的设计模式也可以以不同的方式实现,但我想有一些指导原则不应该被打破或混淆,以分离关注点和持久性无知(PI).

    您实际上在这里问了很多问题,所以我会尽量让答案尽可能简洁:)

    存储库返回一个
    聚合根
    或一个
    实体
    。有些人非常坚决地认为,存储库只返回AR,这很好,而且总是足够的

    有两种类型的存储库(正如沃恩·弗农(Vaughn Vernon)在《实现领域驱动设计》(Implementing Domain Driven Design)一书中所描述的):

    • 面向收藏
    • 面向持久性
    您可能会经常遇到并使用面向持久性的方法。这可能就是w.r.t.DAO的困惑所在。当然,DAO可能会返回一个业务对象,但它可能会返回更多

    在查询示例中,DAO可能更合适。因此,在领域驱动的设计领域,您经常会遇到CQR(命令/查询责任分离)。它归结为不查询您的域

    您应该有一个精简的、专用的查询层,它以最合适的格式返回结果(但不是实体)。在c#中,我使用诸如
    DataTable
    DataRow
    string
    之类的东西,如果需要,有时还会使用复杂的DTO

    存储库只与AR有关,例如:

    • 得到
    • 除去
    存储库基本上使用各种逻辑DAO(ADO.NET、ORM--我尽量避免使用ORM)

    关于使用相关外键检索AR的第二点:AR不应包含对另一个AR的引用。实体和
    值对象
    都可以。对于关联的AR,可以使用ID或值对象来表示外部AR。AR本身可能由复杂结构组成,但不要将所有权与包含混淆。
    订单中包含
    订单行
    客户
    拥有
    订单
    。因此,
    Order
    将有一个
    OrderLine
    集合,但不是对
    Customer
    对象的引用(而是ID/VO)

    Order
    /
    OrderLine
    示例说明了我们为什么不查询域。当我们想要一个在给定的开始日期和结束日期之间的订单列表时,我们可能对所有订单数据不感兴趣,当然对订单行也不感兴趣。因此,装载这些骨料毫无意义。这就是在查询域时,诸如延迟加载之类的令人讨厌的事情悄悄出现的地方。惰性加载不应该存在(IMHO:)---在这里,一个简单的查询层就足够了


    希望这能有所帮助。

    您实际上在这里问了很多问题,所以我会尽量让答案尽可能简洁:)

    存储库返回一个
    聚合根
    或一个
    实体
    。有些人非常坚决地认为,存储库只返回AR,这很好,而且总是足够的

    有两种类型的存储库(正如沃恩·弗农(Vaughn Vernon)在《实现领域驱动设计》(Implementing Domain Driven Design)一书中所描述的):

    • 面向收藏
    • 面向持久性
    您可能会经常遇到并使用面向持久性的方法。这可能就是w.r.t.DAO的困惑所在。当然,DAO可能会返回一个业务对象,但它可能会返回更多

    在查询示例中,DAO可能更合适。因此,在领域驱动的设计领域,您经常会遇到CQR(命令/查询责任分离)。它归结为不查询您的域

    您应该有一个精简的、专用的查询层,它以最合适的格式返回结果(但不是实体)。在c#中,我使用诸如
    DataTable
    DataRow
    string
    之类的东西,如果需要,有时还会使用复杂的DTO

    存储库只与AR有关,例如: