/// <summary>
        /// Processes an Event and Queues Messages to Subscribers
        /// </summary>
        /// <param name="Topic"></param>
        /// <param name="Event"></param>
        /// <param name="EventData"></param>
        /// <returns></returns>
        public async Task ProcessEvent(string Topic, string EventData)
        {
            logger.LogDebug($"Processing ({Topic})");
            var topics = await metadataStore.GetTopicsAsync();

            if (!topics.Contains(Topic, StringComparer.OrdinalIgnoreCase))
            {
                logger.LogWarning($"Not a valid topic");
                return;
            }

            var subscriptionDetails = await subscriberStore.GetSubscriptionsToTopic(Topic);

            if (subscriptionDetails == null || subscriptionDetails.Count() == 0)
            {
                logger.LogWarning($"No Subscribers");
                return;
            }

            // Create Messages to Notify all Subscribers
            foreach (var subscriptionDetail in subscriptionDetails)
            {
                await subscriberQueueStore.EnqueueMessageAsync(new SubscriberMessage
                {
                    DestinationUri = new Uri(subscriptionDetail.BaseUri, subscriptionDetail.RelativePath),
                    SubscriberId   = subscriptionDetail.SubscriberId,
                    JsonBody       = EventData
                });
            }
        }
        /// <summary>
        /// Processes an Update to an Object and Notifies any Subscribers of the Update
        /// </summary>
        /// <param name="ObjectType"></param>
        /// <param name="ObjectId"></param>
        /// <param name="jsonObject"></param>
        /// <returns></returns>
        public async Task UpdateObject(string ObjectType, string ObjectId, string jsonObject)
        {
            logger.LogDebug($"Processing ({ObjectType},{ObjectId})");

            // Check for valid Metadata Type
            var objectTypes = await metadataStore.GetObjectTypesAsync();

            if (!objectTypes.Any(ot => ot.Equals(ObjectType, StringComparison.OrdinalIgnoreCase)))
            {
                logger.LogWarning($"Not a valid ObjectType");
                return;
            }

            // Update the Object
            var existingObject = await objectStore.GetObjectAsync(ObjectType, ObjectId);

            var storedObject  = EventStoreSerialization.DeSerializeObject(existingObject ?? "{}");
            var updatedObject = EventStoreSerialization.DeSerializeObject(jsonObject);

            storedObject["_id"] = ObjectId;
            foreach (var update in updatedObject)
            {
                storedObject[update.Key] = update.Value;
            }
            var newJson = EventStoreSerialization.SerializeObject(storedObject);
            await objectStore.SetObjectAsync(ObjectType, ObjectId, newJson);

            // Check for Subscribers
            var subscriptionDetails = await subscriberStore.GetSubscriptionsToObjectType(ObjectType);

            if (subscriptionDetails == null || subscriptionDetails.Count() == 0)
            {
                logger.LogWarning($"No Subscribers");
                return;
            }

            // Create Messages to Notify all Subscribers
            foreach (var subscriptionDetail in subscriptionDetails)
            {
                await subscriberQueueStore.EnqueueMessageAsync(new SubscriberMessage
                {
                    DestinationUri = new Uri(subscriptionDetail.BaseUri, subscriptionDetail.RelativePath),
                    SubscriberId   = subscriptionDetail.SubscriberId,
                    JsonBody       = newJson
                });
            }
        }