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