/// <summary>
 /// Registers a service as a subscriber for messages of type <paramref name="messageType"/>.
 /// </summary>
 /// <param name="service">The service registering itself as a subscriber for messages of type <paramref name="messageType"/></param>
 /// <param name="messageType">The type of message to register for (each message type has its own <see cref="IBrokerActor"/> instance)</param>
 /// <param name="listenerName">(optional) The name of the listener that is used to communicate with the service</param>
 /// <returns></returns>
 public static Task RegisterMessageTypeAsync(this StatefulServiceBase service, Type messageType, string listenerName = null)
 {
     if (service == null)
     {
         throw new ArgumentNullException(nameof(service));
     }
     if (messageType == null)
     {
         throw new ArgumentNullException(nameof(messageType));
     }
     return(RegisterMessageTypeAsync(service.Context, service.GetServicePartition().PartitionInfo, messageType, listenerName));
 }
 /// <summary>
 /// Unregisters a service as a subscriber for messages of type <paramref name="messageType"/>.
 /// </summary>
 /// <param name="service">The service unregistering itself as a subscriber for messages of type <paramref name="messageType"/></param>
 /// <param name="messageType">The type of message to unregister for (each message type has its own <see cref="IBrokerActor"/> instance)</param>
 /// <param name="flushQueue">Publish any remaining messages.</param>
 /// <returns></returns>
 public static Task UnregisterMessageTypeAsync(this StatefulServiceBase service, Type messageType, bool flushQueue)
 {
     if (service == null)
     {
         throw new ArgumentNullException(nameof(service));
     }
     if (messageType == null)
     {
         throw new ArgumentNullException(nameof(messageType));
     }
     return(UnregisterMessageTypeAsync(service.Context, service.GetServicePartition().PartitionInfo, messageType, flushQueue));
 }
        /// <summary>
        /// Unregisters a Service as a subscriber for messages of type <paramref name="messageType"/> using a <see cref="IRelayBrokerActor"/> approach.
        /// </summary>
        /// <param name="service">The service registering itself as a subscriber for messages of type <paramref name="messageType"/></param>
        /// <param name="messageType">The type of message to unregister for (each message type has its own <see cref="IBrokerActor"/> instance)</param>
        /// <param name="relayBrokerActorId">The ID of the relay broker to unregister with.</param>
        /// <param name="sourceBrokerActorId">(optional) The ID of the source <see cref="IBrokerActor"/> that was used as the source for the <paramref name="relayBrokerActorId"/>
        /// If not specified, the default <see cref="IBrokerActor"/> for the message type <paramref name="messageType"/> will be used.</param>
        /// <param name="flushQueue">Publish any remaining messages.</param>
        /// <returns></returns>
        public static Task UnregisterMessageTypeWithRelayBrokerAsync(this StatefulServiceBase service, Type messageType, ActorId relayBrokerActorId, ActorId sourceBrokerActorId, bool flushQueue)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }
            if (messageType == null)
            {
                throw new ArgumentNullException(nameof(messageType));
            }
            if (relayBrokerActorId == null)
            {
                throw new ArgumentNullException(nameof(relayBrokerActorId));
            }

            return(UnregisterMessageTypeWithRelayBrokerAsync(service.Context, service.GetServicePartition().PartitionInfo, messageType, relayBrokerActorId, sourceBrokerActorId, flushQueue));
        }