开发者

Voyage, Booking, BookingService - Where to put capacity check

开发者 https://www.devze.com 2023-02-19 08:20 出处:网络
I\'m new to domain driven design and would like to hear your thoughts on a design decision: In my domain, I have the entities \"voyage\" and \"booking\".

I'm new to domain driven design and would like to hear your thoughts on a design decision: In my domain, I have the entities "voyage" and "booking". The constructor for voyage looks like this:

public Voyage(VoyageNumber voyageNumber,
                  Schedule schedule,
                  IList<VoyagePrice> voyagePrices,
                  Location location,
                    Capacity capacity)

The value objects "voyagePrices" contain information about the price for a certain person type (child, adult, etc.). The capacity contains the maximum number of persons allowed on the voyage.

The constructor for the "Booking" looks like this:

public Booking(BookingNumber bookingNumber,
        Customer customer,
        Voyage voyage,
        IList<ConfirmedPerson> confirmedPersons)

confirmedPersons contains t开发者_开发技巧he list of persons one customer wants to book (i.e. 2 adults, 1 child). Now, it is of course required to check the capacity of the voyage before allowing the booking to be saved. I dont think that "voyage" should contain a list of all the bookings made. Would it be okay to check the capacity in a BookingService or in a BookingFactory? Do you have any suggestions, maybe with a small code snippet? Thank you!


It completely possible and valid to have an available capacity be part of a Voyage or a boolean encapsulation like

  Voyage.isFull()

Upon retrieval of a specific voyage aggregate from a VoyageRepository this information could be obtained.

However it's not enough, there's always a chance the voyage fills up after you've retrieved it from the VoyageRepository. So you will need to handle that exceptional case, maybe like

  public interface BookingService {
     Booking book(BookingRequest br) throws VoyageIsFullException; 
  }

And you'd probably want a BookingRequestFactory

 public class BookingRequestFactory {
    public static BookingRequest create(Voyage v, Customer c, IList<Person> travelers)
 }

BookingRequestFactory can do some basic validation but not all cause the logic of whether it's full or not will probably require collaboration beyond what'd you'd want in a Object Factory, and is probably best handled by a BookingService.


if i anderstood you right you have to connect the two entities. I would suggest you do it just like it would be done in a relational database. Browse to this link: relational database design and read the paragraph: "Many-to-Many Relationships", i think this could be a solution :-)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号