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); }
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(); } }
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(); }
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); }