Skip to content

Instantly share code, notes, and snippets.

@jasonmitchell
Last active August 22, 2016 20:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jasonmitchell/8648f7ccf6ccf80d8b349b9172acc864 to your computer and use it in GitHub Desktop.
Save jasonmitchell/8648f7ccf6ccf80d8b349b9172acc864 to your computer and use it in GitHub Desktop.
class Order : Aggregate
{
static Order()
{
Given<Order, OrderStarted>((x, e) =>
{
x.Id = e.Id;
x.customerId = e.CustomerId;
x.status = OrderStatus.Open;
x.tickets = new List<Ticket>();
});
Given<Order, TicketsReserved>((x, e) =>
{
var ticket = new Ticket(e.TicketId, e.Quantity);
x.status = OrderStatus.Reserved;
x.tickets.Add(ticket);
x.outstandingBalance += e.TicketPrice * e.Quantity;
});
Given<Order, PaymentReceived>((x, e) =>
{
x.outstandingBalance -= e.Amount;
x.status = OrderStatus.Closed;
});
}
private Guid customerId;
private OrderStatus status;
private List<Ticket> tickets;
private decimal outstandingBalance;
public Order(Guid id, Guid customerId)
{
Then(new OrderStarted(id, customerId));
}
public void When(ReserveTickets command)
{
Then(new TicketsReserved(command.TicketId, command.Quantity, 25));
}
public void When(MakePayment command)
{
Then(new PaymentReceived(123));
}
}
struct Ticket
{
public Ticket(Guid ticketId, int quantity)
{
TicketId = ticketId;
Quantity = quantity;
}
public Guid TicketId { get; }
public int Quantity { get; }
}
enum OrderStatus
{
Open,
Reserved,
Closed
}
abstract class Aggregate
{
public Guid Id { get; protected set; }
protected static void Given<TAggregate, TEvent>(Action<TAggregate, TEvent> action)
{
}
protected void Then<TEvent>(TEvent e)
{
}
}
class ReserveTickets
{
public ReserveTickets(Guid ticketId, int quantity)
{
TicketId = ticketId;
Quantity = quantity;
}
public Guid TicketId { get; }
public int Quantity { get; }
}
class MakePayment
{
public MakePayment(string paymentToken)
{
PaymentToken = paymentToken;
}
public string PaymentToken { get; }
}
class OrderStarted
{
public OrderStarted(Guid id, Guid customerId)
{
Id = id;
CustomerId = customerId;
}
public Guid Id { get; }
public Guid CustomerId { get; }
}
class TicketsReserved
{
public TicketsReserved(Guid ticketId, int quantity, decimal ticketPrice)
{
TicketId = ticketId;
Quantity = quantity;
TicketPrice = ticketPrice;
}
public Guid TicketId { get; }
public int Quantity { get; }
public decimal TicketPrice { get; }
}
class PaymentReceived
{
public PaymentReceived(decimal amount)
{
Amount = amount;
}
public decimal Amount { get; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment