public void AddBillingAddress(Address address) { if (address is null) { throw new ArgumentNullException(nameof(address)); } PendingEvents.Enqueue(new BillingAddressWasAdded(AggregatedId, new { BillingAddress = address })); BillingAddress = address; }
public Customer Create(Document document, Name name, Address address) { AggregatedId = Guid.NewGuid().ToString(); Document = document; Name = name; BillingAddress = address; PendingEvents.Enqueue(new CustomerWasCreated(AggregatedId, new { Document, Name, BillingAddress })); return(this); }
public void ConfirmEmail(Email email) { var exist = Emails.Any(item => item.Equals(email)); if (exist) { Emails.Remove(email); Emails.Add(email); } else { throw new InvalidOperationException("Email not exist"); } PendingEvents.Enqueue(new EmailWasConfirmed(AggregatedId, new { Email = email })); }
/// <summary> /// Raises an event in the finite state machine. /// </summary> /// <param name="e">The instance of the event to raise</param> public void RaiseEvent(FiniteStateEvent e) { string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name; if (log.IsDebugEnabled) { log.Debug($"{methodName}: enter"); } try { if (log.IsInfoEnabled) { log.Info($"{methodName}: [{e.Name}]"); } // // Use a queue so that event handlers can raise events. // lock (PendingEvents) { PendingEvents.Enqueue(e); if (log.IsDebugEnabled) { log.Debug($"{methodName}: handlingEvent = {handlingEvent}"); } if (handlingEvent) { return; } handlingEvent = true; } HandlePendingEvents(); // eliminate race for the flag by using the same lock object lock (PendingEvents) { handlingEvent = false; } } finally { if (log.IsDebugEnabled) { log.Debug($"{methodName}: exit"); } } }
protected void Enqueue(Event @event) { Version++; PendingEvents.Enqueue(@event); }