根据另一个聚合根中的数据进行验证

问题描述 投票:0回答:1

简短版:

Canteen
    openDays
    
Customer
    id
    bookingDays
        change(newBookingDays){
            if (newBookingDays not in >>>canteen.openDays<<<)
                throw ValidationException
            bookingDays.transition(newBookingDays)
        }

我正在存储食堂的预订日期。 Canteen 是我模型中的聚合根,它每个月都有一个 BusinessInterval,用于存储它在哪几天开放。还有另一个聚合根 Customer,它包含每个月自己的 BusinessInterval,它存储客户想在哪几天去食堂吃饭。从我的角度来看,这两个聚合根是有道理的,但这里存在一个巨大的问题。如果我想修改客户的 BusinessInterval,例如cancel booking or add booking for a day,那么我需要知道当月食堂的BusinessInterval,因为食堂不营业的那一天,客户是无法预约的。因此,我需要通过更改客户的 BusinessInterval 来验证此信息。这意味着我需要将信息从聚合根传输到另一个聚合根。我无法将此信息移动到域服务中,因为它肯定属于 Canteen 聚合。我无法将 Canteen 移动到与 Customer 相同的仓库中,因为从设计角度来看这没有意义。我认为此验证代码也不属于应用程序服务,因为当我将它放入 Customer 的 BusinessInterval 中时,它可能只有几行,并且它与其余验证代码一起看起来非常好。它们看起来是相同的抽象级别,它们在做类似的事情。另一方面,每次我在 CustomerRepository 中实例化 Customer 并将 Canteen 实例或 CanteenRepository 注入 CustomerRepository 时调用 Canteen 方法似乎是错误的。我应该如何解决这个问题?我的意思是我可以让它工作,但无论我尝试什么,它都会违反一个或另一个设计规则。 :S

注意: 从某种角度来看,拥有一个 Canteen 聚合根并将 Customer 和 bookingDays 移动到它下面是有意义的,因为当 openDays 发生变化时,bookingDays 也会发生变化。但是我通过在发布后使 openDays 不可变来解决这个问题,并且只能在此之后创建 bookingDays。

domain-driven-design ddd-repositories
1个回答
0
投票

我做的是这样的:

Canteen
    openDays
    bookings[]
        Booking
            id
            Customer.id
            bookingDays: BI
                change(newBookingDays){
                    if (newBookingDays not in >>>canteen.openDays<<<)
                        throw ValidationException
                    bookingDays.transition(newBookingDays)
                }
    
Customer
    id

实际上Customer要复杂得多,不仅仅是一个id,所以我觉得食堂不应该处理,但是预订部分绝对可以由食堂来处理。我喜欢 DDD 规则违规如何让我知道模型中有问题。

© www.soinside.com 2019 - 2024. All rights reserved.