Esempio n. 1
0
 /// <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>
 {
 }
Esempio n. 2
0
        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));
            }
        }