using System.Collections.Generic;
public static void Main()
var commandHandler = new ReserveSeatCommandHandler();
var seatNumbers = new List<int> {
foreach(var seatNumber in seatNumbers)
throw new Exception(string.Format("{0} is not a valid seat Number", seatNumber));
var command = new ReserveSeatCommand { StadiumId = "abc", SeatNumber = seatNumber};
commandHandler.Handle(command);
Console.WriteLine(string.Format("Seat Number {0} reserved successfully", command.SeatNumber));
Console.WriteLine(ex.Message);
public class ReserveSeatCommand
public string StadiumId { get; set; }
public int SeatNumber { get; set; }
public class ReserveSeatCommandHandler
private readonly StadiumRepository repo;
public ReserveSeatCommandHandler()
repo = new StadiumRepository();
public void Handle(ReserveSeatCommand cmd)
var stadium = repo.GetStadium(cmd.StadiumId);
stadium.ReserveSeat(cmd.SeatNumber);
repo.SaveStadium(stadium);
private string stadiumId = "abc";
private Dictionary<int, bool> seatStatus = new Dictionary<int, bool>
public void ReserveSeat(int seatNumber)
if (!seatStatus.ContainsKey(seatNumber))
throw new Exception("no seat for that number");
var seatIsReserved = seatStatus[seatNumber];
throw new Exception(string.Format("Seat Number {0} is already reserved.", seatNumber));
ApplyEvent(new SeatReserved { StadiumId = stadiumId, SeatNumber = seatNumber });
private void ApplyEvent(SeatReserved @event)
seatStatus[@event.SeatNumber] = true;
public class SeatReserved
public string StadiumId { get; set; }
public int SeatNumber { get; set; }
public class StadiumRepository
private Stadium stadium = new Stadium();
public Stadium GetStadium(string StadiumID)
public void SaveStadium(Stadium stadium)