Skip to content

Instantly share code, notes, and snippets.

@aaronmu
Forked from yreynhout/FunWithBaskets.cs
Created June 8, 2018 11:10
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 aaronmu/4b59893a48675968b0af03ff5a7369fb to your computer and use it in GitHub Desktop.
Save aaronmu/4b59893a48675968b0af03ff5a7369fb to your computer and use it in GitHub Desktop.
How can I use child entities?
public class Basket : EventSource
{
private int Id;
private List<Item> Items = new List<Item>();
public Basket()
{
On<ItemAddedToBasket>(e => {
var item = new Item(@event =>
{
switch(@event)
{
case ItemCountIncreased increased:
increased.BasketId = Id;
}
Apply(@event);
});
item.Play(e);
Items.Add(item);
});
On<ItemCountIncreased>(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<object> applier)
: base(applier)
{
On<ItemAddedToBasket>(e => Id = e.ItemId);
On<ItemCountIncreased>(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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment