/// <summary> /// True if the given message are configure to start the saga /// </summary> /// <param name="sagaType"></param> /// <param name="message"></param> /// <returns></returns> public static bool ShouldMessageStartSaga(Type sagaType, Type messageType) { List <Type> messageTypes; SagaTypeToMessageTypesRequiringSagaStartLookup.TryGetValue(sagaType, out messageTypes); if (messageTypes == null) { return(false); } return(messageTypes.Contains(messageType)); }
static void MessageTypeRequiresStartingSaga(Type messageType, Type sagaType) { List <Type> messages; SagaTypeToMessageTypesRequiringSagaStartLookup.TryGetValue(sagaType, out messages); if (messages == null) { messages = new List <Type>(1); SagaTypeToMessageTypesRequiringSagaStartLookup[sagaType] = messages; } if (!messages.Contains(messageType)) { messages.Add(messageType); } }
/// <summary> /// True if the given message are configure to start the saga /// </summary> public bool IsAStartSagaMessage(Type sagaType, Type messageType) { List <Type> messageTypes; SagaTypeToMessageTypesRequiringSagaStartLookup.TryGetValue(sagaType, out messageTypes); if (messageTypes == null) { return(false); } if (messageTypes.Contains(messageType)) { return(true); } return(messageTypes.Any(msgTypeHandleBySaga => msgTypeHandleBySaga.IsAssignableFrom(messageType))); }
/// <summary> /// Gets the saga type to instantiate and invoke if an existing saga couldn't be found by /// the given finder using the given message. /// </summary> /// <param name="message"></param> /// <param name="finder"></param> /// <returns></returns> public static Type GetSagaTypeToStartIfMessageNotFoundByFinder(object message, IFinder finder) { Type sagaEntityType; FinderTypeToSagaEntityTypeLookup.TryGetValue(finder.GetType(), out sagaEntityType); if (sagaEntityType == null) { return(null); } Type sagaType; SagaEntityTypeToSagaTypeLookup.TryGetValue(sagaEntityType, out sagaType); if (sagaType == null) { return(null); } List <Type> messageTypes; SagaTypeToMessageTypesRequiringSagaStartLookup.TryGetValue(sagaType, out messageTypes); if (messageTypes == null) { return(null); } if (messageTypes.Contains(message.GetType())) { return(sagaType); } foreach (var msgTypeHandleBySaga in messageTypes) { if (msgTypeHandleBySaga.IsInstanceOfType(message)) { return(sagaType); } } return(null); }