Esempio n. 1
0
        private static async Task RaiseStateEventWithInMemoryState <T>(MonthlyInvoiceStateMachine stateMachine, Event <T> stateEvent, T data) where T : AccountDomainEvent
        {
            var state = InMemoryStateDictionary.GetValueOrDefault(Guid.Parse(data.StreamId), null);

            if (state == null)
            {
                state = new MonthlyInvoiceState();
                InMemoryStateDictionary.Add(Guid.Parse(data.StreamId), state);
            }

            if (state.AccountStreamVersion > data.EventNumber)
            {
                return;
            }

            state.AccountStreamVersion = data.EventNumber;

            await stateMachine.RaiseEvent(state, stateEvent, data);
        }
Esempio n. 2
0
        private static async Task RaiseStateEventWithSqlState <T>(MonthlyInvoiceStateMachine stateMachine, Event <T> stateEvent, T data) where T : AccountDomainEvent
        {
            using (var context = new StateDbContext())
            {
                var state = await context.MonthlyInvoiceStates.SingleOrDefaultAsync(s => s.AccountId == Guid.Parse(data.StreamId));

                if (state == null)
                {
                    state = new MonthlyInvoiceState();
                    await context.MonthlyInvoiceStates.AddAsync(state);
                }

                if (state.AccountStreamVersion > data.EventNumber)
                {
                    return;
                }

                state.AccountStreamVersion = data.EventNumber;

                await stateMachine.RaiseEvent(state, stateEvent, data);

                await context.SaveChangesAsync();
            }
        }
Esempio n. 3
0
        private static async Task AccountEventAppeared(EventStorePersistentSubscriptionBase eventStorePersistentSubscriptionBase, ResolvedEvent resolvedEvent)
        {
            var accountEvent = ConvertEventDataToAccountDomainEvent(resolvedEvent);

            if (accountEvent == null)
            {
                return;
            }

            accountEvent.EventNumber = resolvedEvent.Event.EventNumber;
            //var semaphore = Locks.GetOrAdd(Guid.Parse(accountEvent.StreamId), new SemaphoreSlim(1));

            //await semaphore.WaitAsync();

            var stateMachine = new MonthlyInvoiceStateMachine(_repository);

            switch (accountEvent)
            {
            case AccountCreatedEvent accountCreated:
                await RaiseStateEvent(stateMachine, stateMachine.AccountCreated, accountCreated);

                break;

            case AccountDebitedEvent accountDebited:
                await RaiseStateEvent(stateMachine, stateMachine.AccountDebited, accountDebited);

                break;

            case MonthlyInvoicePeriodEndedEvent monthlyInvoicePeriodEnded:
                await RaiseStateEvent(stateMachine, stateMachine.MonthlyInvoicePeriodEnded, monthlyInvoicePeriodEnded);

                break;
            }

            //     semaphore.Release();
        }
Esempio n. 4
0
        private static async Task RaiseStateEvent <T>(MonthlyInvoiceStateMachine stateMachine, Event <T> stateEvent, T data) where T : AccountDomainEvent
        {
            await RaiseStateEventWithSqlState(stateMachine, stateEvent, data);

            //await RaiseStateEventWithInMemoryState(stateMachine, stateEvent, data);
        }