/// <summary>
        /// Initializes a new instance of the <see cref="CollaborationInfo"/> class.
        /// </summary>
        /// <param name="agreement">The reference of an agreement between two parties.</param>
        /// <param name="service">The service which acts on the message.</param>
        /// <param name="action">The action within a service that acts on the message.</param>
        /// <param name="conversationId">The conversation identifier of the message.</param>
        public CollaborationInfo(
            AgreementReference agreement,
            Service service,
            string action,
            string conversationId)
        {
            if (service == null)
            {
                throw new ArgumentNullException(nameof(service));
            }

            if (action == null)
            {
                throw new ArgumentNullException(nameof(action));
            }

            if (conversationId == null)
            {
                throw new ArgumentNullException(nameof(conversationId));
            }

            AgreementReference = (agreement != null).ThenMaybe(agreement);
            Service            = service;
            Action             = action;
            ConversationId     = conversationId;
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="CollaborationInfo"/> class.
 /// </summary>
 /// <param name="agreement">The reference of an agreement between two parties.</param>
 public CollaborationInfo(AgreementReference agreement)
     : this(
         agreement : agreement,
         service : Service.TestService,
         action : Constants.Namespaces.TestAction,
         conversationId : DefaultConversationId)
 {
 }
 /// <summary>
 /// Serves as the default hash function.
 /// </summary>
 /// <returns>A hash code for the current object.</returns>
 public override int GetHashCode()
 {
     unchecked
     {
         int hashCode = AgreementReference.GetHashCode();
         hashCode = (hashCode * 397) ^ Service.GetHashCode();
         hashCode = (hashCode * 397) ^ Action.GetHashCode();
         hashCode = (hashCode * 397) ^ ConversationId.GetHashCode();
         return(hashCode);
     }
 }
        /// <summary>
        /// Indicates whether the current object is equal to another object of the same type.
        /// </summary>
        /// <param name="other">An object to compare with this object.</param>
        /// <returns>true if the current object is equal to the <paramref name="other" /> parameter; otherwise, false.</returns>
        public bool Equals(CollaborationInfo other)
        {
            if (other is null)
            {
                return(false);
            }

            if (ReferenceEquals(this, other))
            {
                return(true);
            }

            return(AgreementReference.Equals(other.AgreementReference) &&
                   Service.Equals(other.Service) &&
                   String.Equals(Action, other.Action) &&
                   String.Equals(ConversationId, other.ConversationId));
        }