航程,预订,预订服务 - 在何处进行容量检查

时间:2011-03-24 20:33:59

标签: c# service domain-driven-design

我是域驱动设计的新手,想听听您对设计决策的看法: 在我的域名中,我有实体“航行”和“预订”。 航行的构造函数如下:

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中的容量是否可以?你有任何建议,也许有一个小代码片段?谢谢!

2 个答案:

答案 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并阅读段落:“多对多关系”,我认为这可能是一个解决方案: - )