【问题标题】:How to persist aggregates with repositories?如何使用存储库持久化聚合?
【发布时间】:2015-11-18 09:24:01
【问题描述】:

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

假设我有一个 Product 的聚合根。现在我不想注入 ProductRepository,它将在 Product 类本身的构造函数中保留这个聚合根。想象一下我写的代码像

var prod = new Product(Factory.CreateProductRepository(), name, costprice);

在 UI 层。如果我不想通过聚合根中的依赖注入来注入我的存储库,那么问题是这段代码应该去哪里?我应该只为持久化这个 AR 创建一个类吗?谁能建议解决此问题的正确和推荐方法是什么?

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

【问题讨论】:

    标签: c# domain-driven-design persistence aggregateroot


    【解决方案1】:

    应用服务

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

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

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

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

    存储库Ganularity

    ​​>

    关于你的第二个问题

    我应该创建一个仅用于持久化此 AR 的类吗?

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

    您还可以为非域信息创建其他存储库,例如统计数据。但是,在这些情况下,请确保您不会意外遗漏域概念。

    【讨论】:

    • 简而言之,想想:Factory.CreateProductRepository()->persist(product)
    • 精彩的答案!谢谢:)
    • 我喜欢您的想法,并将考虑如何进一步整合它。让我担心的是,在这种情况下,系统将需要一个中间层来与 BL 通信。关于答案的附注:我到处读到不鼓励使用通用存储库,尤其是在 DDD 中,我可以看到其背后的原因是保持与业务相关的更改意图。
    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 2012-09-06
    • 1970-01-01
    • 2010-11-16
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多