コード例 #1
0
        public async ValueTask <GeneralLedger> Get(CancellationToken cancellationToken = default)
        {
            var optional = await _inner.GetOptional(GeneralLedger.Identifier, cancellationToken);

            if (optional.HasValue)
            {
                return(optional.Value);
            }

            var generalLedger = GeneralLedger.Factory();

            _inner.Add(generalLedger);
            return(generalLedger);
        }
コード例 #2
0
        public async ValueTask <GeneralLedger> Get(CancellationToken cancellationToken = default)
        {
            if (_unitOfWork.TryGet(GeneralLedger.Identifier, out var a) && a is GeneralLedger generalLedger)
            {
                return(generalLedger);
            }

            await using var events = _eventStore.ReadStreamAsync(Direction.Backwards,
                                                                 GeneralLedger.Identifier, StreamPosition.End, int.MaxValue, cancellationToken: cancellationToken);

            generalLedger = GeneralLedger.Factory();

            var            stack          = new Stack <object>();
            bool           lastEventRead  = false;
            StreamPosition streamPosition = default;

            await foreach (var resolvedEvent in events)
            {
                if (!lastEventRead)
                {
                    streamPosition = resolvedEvent.OriginalEvent.EventNumber;
                    lastEventRead  = true;
                }

                var @event = JsonSerializer.Deserialize(resolvedEvent.OriginalEvent.Data.Span,
                                                        _messageTypeMapper.Map(resolvedEvent.OriginalEvent.EventType),
                                                        TransactoSerializerOptions.Events);
                stack.Push(@event);

                if (@event is GeneralLedgerOpened || @event is AccountingPeriodClosed)
                {
                    break;
                }
            }

            generalLedger.LoadFromHistory(stack);

            _unitOfWork.Attach(GeneralLedger.Identifier, generalLedger, streamPosition.ToInt64());

            return(generalLedger);
        }