/// <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); } } }
public void SetObject(ReplicationInfo replicationInfo, OperationType operationType) { ReplicatedObjectsSubsystem.PrepareReplicationObject(replicationInfo, operationType); SubscribersDistributer.SendObjectChanged(replicationInfo, operationType, GetSubscriber()); }