using System; using System.Collections.Generic; namespace EventSourcing.Demo { public class WarehouseProductRepository { private readonly List<Action<IEvent>> _projectionCallbacks = new(); private readonly Dictionary<string, List<IEvent>> _inMemoryStreams = new(); public WarehouseProduct Get(string sku) { var warehouseProduct = new WarehouseProduct(sku); if (_inMemoryStreams.ContainsKey(sku)) { foreach (var evnt in _inMemoryStreams[sku]) { warehouseProduct.ApplyEvent(evnt); } } return warehouseProduct; } public void Save(WarehouseProduct warehouseProduct) { if (_inMemoryStreams.ContainsKey(warehouseProduct.Sku) == false) { _inMemoryStreams.Add(warehouseProduct.Sku, new List<IEvent>()); } var newEvents = warehouseProduct.GetUncommittedEvents(); _inMemoryStreams[warehouseProduct.Sku].AddRange(newEvents); warehouseProduct.EventsCommitted(); foreach (var newEvent in newEvents) { foreach (var callback in _projectionCallbacks) { callback(newEvent); } } } public void Subscribe(Action<IEvent> callback) { _projectionCallbacks.Add(callback); } } }