/// <summary> /// Adds support for the specified message type. /// </summary> /// <typeparam name="TMessage"> /// The type of the message for which support is added. /// </typeparam> /// <param name="entityType"> /// The targeted entity type. /// </param> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="entityType" /> is equal to <see cref="MessagingEntityType.Unspecified" />. /// </exception> /// <exception cref="InvalidOperationException"> /// <typeparamref name="TMessage" /> was already added. /// </exception> public void AddSubscriber <TMessage>(MessagingEntityType entityType) where TMessage : class, IMessage { var messageType = typeof(TMessage); if (SupportedMessageTypesReference.Contains(messageType)) { throw new InvalidOperationException($"Support for the type {messageType.FullName} was already added."); } SupportedMessageTypesReference.Add(messageType); RootDependencyScope.Resolve <IMessageSubscriptionClient>().RegisterHandler <TMessage>((message) => HandleMessage(message), entityType); }
/// <summary> /// Adds support for the specified request message type. /// </summary> /// <typeparam name="TRequestMessage"> /// The type of the request message for which support is added. /// </typeparam> /// <typeparam name="TResponseMessage"> /// The type of the response message that is associated with <typeparamref name="TRequestMessage" />. /// </typeparam> /// <exception cref="InvalidOperationException"> /// <typeparamref name="TRequestMessage" /> was already added. /// </exception> public void AddRequestSubscriber <TRequestMessage, TResponseMessage>() where TRequestMessage : class, IRequestMessage <TResponseMessage> where TResponseMessage : class, IResponseMessage { var requestMessageType = typeof(TRequestMessage); if (SupportedMessageTypesReference.Contains(requestMessageType)) { throw new InvalidOperationException($"Support for the type {requestMessageType.FullName} was already added."); } SupportedMessageTypesReference.Add(requestMessageType); RootDependencyScope.Resolve <IMessageSubscriptionClient>().RegisterHandler <TRequestMessage, TResponseMessage>((requestMessage) => HandleRequestMessage <TRequestMessage, TResponseMessage>(requestMessage)); }
private void HandleMessage <TMessage>(TMessage message) where TMessage : class, IMessage { try { using (var dependencyScope = RootDependencyScope.CreateChildScope()) { using (var subscriber = dependencyScope.Resolve <IMessageSubscriber <TMessage> >()) { subscriber.Process(message); } } } catch (MessageSubscriptionException) { throw; } catch (Exception exception) { throw new MessageSubscriptionException(typeof(TMessage), exception); } }
private TResponseMessage HandleRequestMessage <TRequestMessage, TResponseMessage>(TRequestMessage requestMessage) where TRequestMessage : class, IRequestMessage <TResponseMessage> where TResponseMessage : class, IResponseMessage { try { using (var dependencyScope = RootDependencyScope.CreateChildScope()) { using (var subscriber = dependencyScope.Resolve <IMessageSubscriber <TRequestMessage, TResponseMessage> >()) { return(subscriber.Process(requestMessage)); } } } catch (MessageSubscriptionException) { throw; } catch (Exception exception) { throw new MessageSubscriptionException(typeof(TRequestMessage), exception); } }
/// <summary> /// Creates a new dependency scope. /// </summary> /// <returns> /// A new dependency scope. /// </returns> /// <exception cref="CreateDependencyScopeException"> /// An exception was raised while attempting to create the scope. /// </exception> /// <exception cref="ObjectDisposedException"> /// The object is disposed. /// </exception> protected IDependencyScope CreateDependencyScope() => RootDependencyScope.CreateChildScope();