Пример #1
0
        /// <summary>
        /// Looks up an existing saga data of the given type with a property of the specified name and the specified value
        /// </summary>
        public async Task <ISagaData> Find(Type sagaDataType, string propertyName, object propertyValue)
        {
            lock (_lock)
            {
                var valueFromMessage = (propertyValue ?? "").ToString();

                foreach (var data in _data.Values)
                {
                    if (data.GetType() != sagaDataType)
                    {
                        continue;
                    }

                    var sagaValue     = Reflect.Value(data, propertyName);
                    var valueFromSaga = (sagaValue ?? "").ToString();

                    if (valueFromMessage.Equals(valueFromSaga))
                    {
                        var clone = Clone(data);
                        Correlated?.Invoke(clone);
                        return(clone);
                    }
                }

                CouldNotCorrelate?.Invoke();
                return(null);
            }
        }
    /// <summary>
    /// Looks up an existing saga data of the given type with a property of the specified name and the specified value
    /// </summary>
    public async Task <ISagaData> Find(Type sagaDataType, string propertyName, object propertyValue)
    {
        lock (_lock)
        {
            var valueFromMessage = (propertyValue ?? "").ToString();

            foreach (var data in _data.Values)
            {
                if (data.GetType() != sagaDataType)
                {
                    continue;
                }

                var sagaValue     = Reflect.Value(data, propertyName);
                var valueFromSaga = (sagaValue ?? "").ToString();

                if (valueFromMessage.Equals(valueFromSaga))
                {
                    var id = data.Id;

                    if (_sagaDatasToCauseConflict.ContainsKey(id))
                    {
                        if (!_previousDatas.TryGetValue(id, out var previousSagaData))
                        {
                            throw new ArgumentException($"Sorry, but weirdly the saga data ID {id} could not be found in the storage for previous saga data versions");
                        }
                        var cloneOfPreviousSagaData = Clone(previousSagaData);
                        _sagaDatasToCauseConflict.TryRemove(id, out _);
                        Correlated?.Invoke(cloneOfPreviousSagaData);
                        return(cloneOfPreviousSagaData);
                    }

                    var clone = Clone(data);
                    Correlated?.Invoke(clone);
                    return(clone);
                }
            }

            CouldNotCorrelate?.Invoke();
            return(null);
        }
    }