gpt4 book ai didi

c# - 如何使用存储库持久化聚合?

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:36 26 4
gpt4 key购买 nike

我正在尝试学习有关 DDD 的一些概念,而持久化聚合的部分让我有些困惑。我已经阅读了有关 SO 主题的各种答案,但似乎都没有回答我的问题。

假设我有一个产品的聚合根。现在我不想在 Product 类本身的构造函数中注入(inject)将保留此聚合根的 ProductRepository。想象一下我正在编写像

这样的代码
var prod = new Product(Factory.CreateProductRepository(), name, costprice);

在用户界面层。如果我不想通过聚合根中的依赖注入(inject)来注入(inject)我的存储库,那么问题是这段代码应该去哪里?我是否应该创建一个类来仅保留此 AR?谁能建议解决此问题的正确和推荐方法是什么?

我关心的不是使用哪个 ORM 或如何使这个 AR ORM 友好或易于持久化,我的问题是关于正确使用存储库或任何持久性类。

最佳答案

应用服务

你是对的,领域层应该对持久化一无所知。所以将存储库注入(inject) Product 确实是个坏主意。

您正在寻找的 DDD 概念称为应用程序服务。应用服务不是域层的一部分,而是位于服务层(有时称为应用层)。应用程序服务代表一个用例(与域概念相反)并具有以下职责:

  • 执行输入验证
  • 实现访问控制
  • 执行事务控制

最后一点意味着应用程序服务将查询存储库以获取特定类型的聚合(例如通过 ID),使用其方法之一对其进行修改,然后将其传回存储库以更新数据库。

存储库粒度

关于你的第二个问题

Should I create a class only for persisting this AR?

是的,为每个聚合创建一个存储库是一种常见的方法。通常,getById()update()delete() 等标准存储库操作被提取到可重用的类(或者是基类或聚合)。

您还可以为非域信息创建额外的存储库,例如统计数据。但是,在这些情况下,请确保您不会不小心错过领域概念。

关于c# - 如何使用存储库持久化聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776076/

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