public class Basket : EventSource { private int Id; private List Items = new List(); public Basket() { On(e => { var item = new Item(@event => { switch(@event) { case ItemCountIncreased increased: increased.BasketId = Id; } Apply(@event); }); item.Play(e); Items.Add(item); }); On(e => { var item = Items.Single(candidate => candidate.Id == e.ItemId); item.Play(e); }) } public void AddItem(int item) { Apply(new ItemAddedToBasket { BasketId = Id, ItemId = item }); } //behavior - v1 public void IncreaseItemCount(int item) { var item = Items.Single(candidate => candidate.Id == e.ItemId); item.IncreaseCount(); } //behavior - v2 public Item FindItem(int item) { return Items.Single(candidate => candidate.Id == e.ItemId); } public class Item : Entity { public int Id { get; } private int Count; public Item(Action applier) : base(applier) { On(e => Id = e.ItemId); On(e => Count++); } public void IncreaseCount() { Apply(new ItemCountIncreased { ItemId = Id }); } } } //Handle AddItemToBasket var basket = baskets.FindById(msg.Body.BasketId); basket.AddItem(msg.Body.ItemId); //Handle IncreaseItemCountInBasket var basket = baskets.FindById(msg.Body.BasketId); basket.IncreaseItemCount(msg.Body.ItemId); or var basket = baskets.FindById(msg.Body.BasketId); var item = basket.FindItem(msg.Body.ItemId); item.IncreaseCount(); BaskCreated ItemAddedToBasket ItemCountIncreased