/// <summary>
        /// Отправить уведомление об изменении состоянии объекта
        /// </summary>
        /// <param name="replicationInfo">Информация о реплицируемом объекте</param>
        /// <param name="operationType">Тип операции репликации</param>
        /// <param name="sender">Отправитель</param>
        public void SendObjectChanged(ReplicationInfo replicationInfo, OperationType operationType, IReplicationCallbackContract sender)
        {
            IReplicationCallbackContract[] subscribersCopy;

            lock (_subscribers)
            {
                subscribersCopy = _subscribers.Where(s=> s!=sender).ToArray();
            }

            foreach (var subscriber in subscribersCopy)
            {
                if (((ICommunicationObject)subscriber).State == CommunicationState.Opened)
                {
                    try
                    {
                        subscriber.SimulateObjectChanged(replicationInfo, operationType);
                    }
                    catch (Exception ex)
                    {
                        //TODO сделать лог
                    }
                }
                else
                {
                    RemoveSubscriber(subscriber);
                }
            }
        }
 /// <summary>
 /// Удалить объект репликации
 /// </summary>
 /// <param name="replicationInfo">Информация о реплицируемом объекте</param>
 public void DeleteReplicationObject(ReplicationInfo replicationInfo)
 {
     lock (_replicationObjects)
     {
         _replicationObjects.RemoveAll(r => String.Compare(r.Uid.ToString(), replicationInfo.Uid.ToString(), StringComparison.OrdinalIgnoreCase) == 0);
     }
 }
 /// <summary>
 /// Создать объект репликации
 /// </summary>
 /// <param name="replicationInfo">Информация о реплицируемом объекте</param>
 public void CreateReplicationObject(ReplicationInfo replicationInfo)
 {
     lock (_replicationObjects)
     {
         _replicationObjects.Add(replicationInfo);
     }
 }
 /// <summary>
 /// Подготовить объект для репликации
 /// </summary>
 /// <param name="replicationInfo">Информация о реплицируемом объекте</param>
 /// <param name="operationType">Тип операции</param>
 public void PrepareReplicationObject(ReplicationInfo replicationInfo, OperationType operationType)
 {
     switch (operationType)
     {
         case OperationType.Create:
             CreateReplicationObject(replicationInfo);
             break;
         case OperationType.Update:
             UpdateReplicationObject(replicationInfo);
             break;
         case OperationType.Delete:
             DeleteReplicationObject(replicationInfo);
             break;
     }
 }
 /// <summary>
 /// Обновить объект репликации
 /// </summary>
 /// <param name="replicationInfo">Информация о реплицируемом объекте</param>
 public void UpdateReplicationObject(ReplicationInfo replicationInfo)
 {
     lock (_replicationObjects)
     {
         var existedReplicationClass = _replicationObjects.FirstOrDefault(r => String.Compare(r.Uid.ToString(), replicationInfo.Uid.ToString(), StringComparison.OrdinalIgnoreCase) == 0);
         if (existedReplicationClass != null)
         {
             existedReplicationClass.UpdateProperties(replicationInfo.Properties);
         }
     }
 }
Ejemplo n.º 6
0
 public void SetObject(ReplicationInfo replicationInfo, OperationType operationType)
 {
     ReplicatedObjectsSubsystem.PrepareReplicationObject(replicationInfo, operationType);
     SubscribersDistributer.SendObjectChanged(replicationInfo, operationType, GetSubscriber());
 }