/// <summary> /// Вызывается перед началом выполнения команд в рассылке <typeparamref name="TSubscription"/>. /// </summary> /// <param name="subscription">Экземпляр объекта, олицетворяющего подписку.</param> /// <param name="parameters">Набор параметров для конкретного вызова подписки.</param> /// <param name="messagingContacts">Список подписчиков-получателей информации.</param> /// <seealso cref="SubscriptionParametrizedCall{TParameters}.ExecuteSubscription{TSubscription}"/> /// <seealso cref="AsParametrized{TParameters}(TParameters)"/> protected virtual void OnSendBeforeExecution <TSubscription, TParameters>(TSubscription subscription, TParameters parameters, MessagingContacts messagingContacts) where TSubscription : SubscriptionBase <TSubscription, TParameters> { }
internal ExecutionResult <Exception> ExecuteSubscription <TSubscription, TParameters>(TParameters parameters) where TSubscription : SubscriptionBase <TSubscription, TParameters> { if (!_subscriptions.TryGetValue(typeof(TSubscription), out var info)) { return(new ExecutionResult <Exception>( false, "Указанная подписка не найдена среди подтвержденных", new ArgumentException("Указанная подписка не найдена среди подтвержденных", nameof(TSubscription)))); } var subscriptionInstance = (TSubscription)info.Item1; try { var messagingContacts = new MessagingContacts(); using (var db = new Db.DataContext()) { var queryFromUsers = db.SubscriptionUser.Where(x => x.IdSubscription == subscriptionInstance.SubscriptionDescription.Id).Select(x => new { x.IdUser }); var dataFromUsers = queryFromUsers.ToList(); var userIdList = dataFromUsers.Select(x => x.IdUser).ToList(); var queryFromContacts = from smc in db.SubscriptionMessagingContact join mc in db.MessagingContact on smc.IdMessagingContact equals mc.IdMessagingContact join mcd in db.MessagingContactData on mc.IdMessagingContact equals mcd.IdMessagingContactData where smc.IdSubscription == subscriptionInstance.SubscriptionDescription.Id select new { mc.NameFull, mcd.IdMessagingContact, mcd.IdMessagingServiceType, mcd.Data }; var types = new Dictionary <int, Type>(); var getType = new Func <int, Type>(idMessagingServiceType => { if (types.TryGetValue(idMessagingServiceType, out var t)) { return(t); } t = Core.Items.ItemTypeFactory.GetClsType(idMessagingServiceType); types[idMessagingServiceType] = t; return(t); }); var dataFromContacts = queryFromContacts. ToList(). GroupBy(x => new { x.IdMessagingContact, x.NameFull }, x => new { x.Data, x.IdMessagingServiceType }). Select(x => new MessagingContact() { Id = x.Key.IdMessagingContact, NameFull = x.Key.NameFull, _data = x.GroupBy(y => y.IdMessagingServiceType, y => y.Data).ToDictionary(y => getType(y.Key), y => y.ToList()) }); messagingContacts.AddRange(dataFromContacts); } OnSendBeforeExecution(subscriptionInstance, parameters, messagingContacts); foreach (var pair in subscriptionInstance._services) { try { var messagingService = AppCore.Get <IMessagingService>(pair.Key); if (messagingService == null) { var msg = $"Рассылка: '{subscriptionInstance.SubscriptionDescription.Id}' / '{subscriptionInstance.SubscriptionDescription.Name}'.\r\n"; msg += $"Коннектор: '{pair.Key.FullName}' / '{pair.Value.GetType().FullName}'."; this.RegisterEvent(Journaling.EventType.Error, "Ошибка поиска сервиса отправки/получения сообщений для рассылки", msg); } pair.Value(messagingService, subscriptionInstance.SubscriptionDescription, parameters, messagingContacts); } catch (Exception ex) { var msg = $"Рассылка: '{subscriptionInstance.SubscriptionDescription.Id}' / '{subscriptionInstance.SubscriptionDescription.Name}'.\r\n"; msg += $"Коннектор: '{pair.Key.FullName}' / '{pair.Value.GetType().FullName}'."; this.RegisterEvent(Journaling.EventType.Error, "Неожиданная ошибка рассылки", msg, ex); } } return(new ExecutionResult <Exception>(true)); } catch (Exception ex) { var msg = $"Рассылка: '{subscriptionInstance.SubscriptionDescription.Id}' / '{subscriptionInstance.SubscriptionDescription.Name}'.\r\n"; this.RegisterEvent(Journaling.EventType.Error, "Неожиданная ошибка рассылки", msg, ex); return(new ExecutionResult <Exception>(false, "Неожиданная ошибка рассылки", ex)); } }