DDD 中的值对象从哪里来?

Where do value objects come from in DDD?

我目前正在从事业余项目以感受 DDD,我想知道从中获取值对象的存储库组件是什么。

在我的市场限界上下文中,目录由商家管理并包含按类别和宇宙组织的报价

在这里,我的猜测是 Merchant、Catalog 和 Universe 将是聚合根,因为它们在系统中具有全局标识,而 Offer 将是 Catalog 聚合的实体,而 Category 将是一个值对象,就像一个标签优惠。

然后我会让存储库充当 AR 持久性的门面,但我不明白,关于 DDD 构建块,我将如何处理类别的检索(商家应该能够在他的目录中定义类别,然后使用它们来标记他添加到其中的商品)。

谁能提供一些指导?

谢谢

正如您所指出的,值对象不是实体,因此不应直接从存储库中检索。但是,它们 aspects/properties 属于一个实体。

当您希望引用 Catalog 的所有 Categories 时,原则上您是在对 Catalog 执行查询;你包含哪个Categories

由于 CategoriesCatalog 都是聚合根,您可能需要使用域服务(这些服务用于执行交叉聚合操作等)。

这可能导致以下代码:

class CategoryListingService
{
    public ICollection<Category> GetCategoriesForCatalog(Catalog catalog)
    {
        var offers = offerRepository.GetAllOffersFrom(catalog)
        var categories = offers.Select(o => o.Category).Distinct();
        return categories;
    }
}

请注意,这是 C# 中的示例代码,但它背后的想法应该可行,并允许您列出目录中存在的所有商品类别。