我是域驱动设计的新手,想听听您对设计决策的看法: 在我的域名中,我有实体“航行”和“预订”。 航行的构造函数如下:
public Voyage(VoyageNumber voyageNumber,
Schedule schedule,
IList<VoyagePrice> voyagePrices,
Location location,
Capacity capacity)
值对象“voyagePrices”包含有关特定人员类型(儿童,成人等)的价格的信息。容量包含航程中允许的最大人数。
“预订”的构造函数如下所示:
public Booking(BookingNumber bookingNumber,
Customer customer,
Voyage voyage,
IList<ConfirmedPerson> confirmedPersons)
确认人员包含一个客户想要预订的人员列表(即2名成人,1名儿童)。现在,当然需要在允许保存预订之前检查航行的容量。我不认为“航程”应该包含所有预订的清单。检查BookingService或BookingFactory中的容量是否可以?你有任何建议,也许有一个小代码片段?谢谢!
答案 0 :(得分:1)
将可用容量作为Voyage或布尔封装的一部分是完全可能且有效的
Voyage.isFull()
从VoyageRepository中检索特定的航程聚合时,可以获得此信息。
然而,这还不够,在您从VoyageRepository中检索之后,航行总是有可能填满。因此,您需要处理这种特殊情况,例如
public interface BookingService {
Booking book(BookingRequest br) throws VoyageIsFullException;
}
你可能想要一个BookingRequestFactory
public class BookingRequestFactory {
public static BookingRequest create(Voyage v, Customer c, IList<Person> travelers)
}
BookingRequestFactory可以进行一些基本的验证,但并非所有都会导致它是否已满的逻辑可能需要超出您在Object Factory中所需的协作,并且可能最好由BookingService处理。
答案 1 :(得分:0)
如果我理解你,你必须连接这两个实体。我建议你这样做就像在关系数据库中完成它一样。浏览到此链接:relational database design并阅读段落:“多对多关系”,我认为这可能是一个解决方案: - )