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 }));
        }
Beispiel #4
0
        /// <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");
                }
            }
        }
Beispiel #5
0
 protected void Enqueue(Event @event)
 {
     Version++;
     PendingEvents.Enqueue(@event);
 }