Exemplo n.º 1
0
        /// <summary>
        /// Уведомляем всех подписчиков об изменении указанных объектов.
        /// Объекты в списке могут быть разных типов, метод разделит списки уведомлений, по типам объектов.
        /// </summary>
        /// <param name="subject">Subject.</param>
        public static void NotifyObjectUpdated(params object[] updatedSubjects)
        {
            if (ClassMappingList == null)
            {
                return;
            }
            // Чистим список от удаленных объектов.
            if (DateTime.Now.Subtract(lastCleaning).TotalSeconds > 1)
            {
                delayedNotifies.RemoveAll(d => d.ParentObject == null || d.ChangedObject == null);
                lastCleaning = DateTime.Now;
            }

            foreach (Type subjectType in updatedSubjects.Select(s => NHibernateProxyHelper.GuessClass(s)).Distinct())
            {
                IOrmObjectMapping map = ClassMappingList.Find(m => m.ObjectClass == subjectType);
                if (map != null)
                {
                    map.RaiseObjectUpdated(updatedSubjects.Where(s => NHibernateProxyHelper.GuessClass(s) == subjectType).ToArray());
                }
                else
                {
                    logger.Warn("В ClassMapingList класс {0} объекта не найден. Поэтому событие обновления не вызвано.", subjectType);
                }

                // Отсылаем уведомления дочерним объектам если они есть.
                foreach (DelayedNotifyLink link in delayedNotifies.FindAll(l => OrmMain.Equals(l.ParentObject, updatedSubjects[0])))
                {
                    NotifyObjectUpdated(link.ChangedObject);
                    delayedNotifies.Remove(link);
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Уведомляем всех подписчиков об изменении указанных объектов.
        /// Объекты в списке могут быть разных типов, метод разделит списки уведомлений, по типам объектов.
        /// </summary>
        /// <param name="subject">Subject.</param>
        public static void NotifyObjectUpdated(EntityChangeEvent[] updatedSubjects)
        {
            if (ClassMappingList == null)
            {
                return;
            }

            var eventsGroups = updatedSubjects
                               .Where(ev => ev.EventType == TypeOfChangeEvent.Insert || ev.EventType == TypeOfChangeEvent.Update)
                               .GroupBy(s => s.EntityClass);

            foreach (var entityClassGroup in eventsGroups)
            {
                IOrmObjectMapping map = ClassMappingList.Find(m => m.ObjectClass == entityClassGroup.Key);
                if (map != null)
                {
                    map.RaiseObjectUpdated(entityClassGroup.Select(x => x.Entity).ToArray());
                }
                else
                {
                    logger.Warn("В ClassMapingList класс {0} объекта не найден. Поэтому событие обновления не вызвано.", entityClassGroup.Key);
                }
            }
        }