예제 #1
0
        /// <summary>
        /// Verifica se na configuração existe o endereço com o nome informado.
        /// </summary>
        /// <param name="addressName">Nome do endereço</param>
        /// <param name="servicesContext">Contexto dos serviços.</param>
        /// <param name="useAddressProvider">Identifica se é para verifica pelo AddressProvider</param>
        /// <returns></returns>
        public bool Contains(string addressName, string servicesContext, bool useAddressProvider)
        {
            var key = new ServiceAddressKey(addressName, servicesContext);

            lock (_serviceAddress)
                if (_serviceAddress.ContainsKey(key))
                {
                    return(true);
                }
            if (!useAddressProvider)
            {
                return(false);
            }
            var addressProvider = GetServiceAddressProvider();

            if (addressProvider != null)
            {
                var addresses = addressProvider.GetServiceAddresses(addressName, servicesContext);
                if (addresses != null && addresses.Length > 0)
                {
                    Add(addresses[new Random().Next(0, addresses.Length - 1)], servicesContext);
                    return(true);
                }
            }
            return(false);
        }
예제 #2
0
        /// <summary>
        /// Recupera o endereço pelo nome informado.
        /// </summary>
        /// <param name="addressName"></param>
        /// <param name="servicesContext">Contexto de serviços.</param>
        /// <returns></returns>
        private ServiceAddress Get(string addressName, string servicesContext)
        {
            ServicesConfigurationEntry result = null;
            var key = new ServiceAddressKey(addressName, servicesContext);

            lock (_serviceAddress)
                if (_serviceAddress.TryGetValue(key, out result))
                {
                    return(result.Address);
                }
            var addressProvider = GetServiceAddressProvider();

            if (addressName == addressProvider.ProviderAddressName)
            {
                throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.ImpossibleRecoverAddressProviderAddress, addressName).Format());
            }
            if (addressProvider != null)
            {
                var addresses = addressProvider.GetServiceAddresses(addressName, servicesContext);
                if (addresses != null && addresses.Length > 0)
                {
                    Add(addresses[new Random().Next(0, addresses.Length - 1)], servicesContext);
                }
                else
                {
                    throw new ServiceConfigurationException(string.Format(Properties.Resources.ServiceConfiguration_AddressNotFoundInAddressProvider, addressName, servicesContext));
                }
                lock (_serviceAddress)
                    if (_serviceAddress.TryGetValue(key, out result))
                    {
                        return(result.Address);
                    }
            }
            throw new ServiceConfigurationException(string.Format(Properties.Resources.ServiceConfiguration_AddressNotFound, addressName));
        }
예제 #3
0
        /// <summary>
        /// Remove o endereço da configuração.
        /// </summary>
        /// <param name="addressName">Nome do endereço registrado.</param>
        /// <param name="servicesContext">Contexto de serviços.</param>
        /// <returns>True caso o endereço tenha sido removido com sucesso.</returns>
        public bool Remove(string addressName, string servicesContext)
        {
            var key = new ServiceAddressKey(addressName, servicesContext);
            ServicesConfigurationEntry entry = null;
            var contains = false;

            lock (_serviceAddress)
                if (_serviceAddress.TryGetValue(key, out entry))
                {
                    _serviceAddress.Remove(key);
                }
            if (contains)
            {
                OnRemoved(addressName, entry);
            }
            return(contains);
        }
예제 #4
0
        /// <summary>
        /// Adiciona um novo endereço de serviço para a configuração do sistema.
        /// </summary>
        /// <param name="address">Endereço que será adicionado.</param>
        /// <param name="servicesContext">Contexto de serviços associado.</param>
        /// <param name="ignoreReset">Identifica se é para ignorar o reset do endereço.</param>
        /// <returns></returns>
        public bool Add(ServiceAddress address, string servicesContext, bool ignoreReset)
        {
            address.Require("address").NotNull();
            var key = new ServiceAddressKey(address.Name, servicesContext, ignoreReset);
            ServicesConfigurationEntry entry = null;

            lock (_serviceAddress)
            {
                if (_serviceAddress.ContainsKey(key))
                {
                    return(false);
                }
                entry = new ServicesConfigurationEntry(address, servicesContext);
                _serviceAddress.Add(key, entry);
            }
            OnAdded(address.Name, entry);
            return(true);
        }
예제 #5
0
 /// <summary>
 /// Recupera o endereço do serviço pelo nome informado.
 /// </summary>
 /// <param name="addressName"></param>
 /// <param name="servicesContext"></param>
 /// <returns></returns>
 public ServiceAddress this[string addressName, string servicesContext]
 {
     get
     {
         return(Get(addressName, servicesContext));
     }
     set
     {
         var key = new ServiceAddressKey(addressName, servicesContext);
         _serviceAddress.Remove(key);
         if (value != null)
         {
             var entry = new ServicesConfigurationEntry(value, this.ServicesContext);
             _serviceAddress.Add(key, entry);
             OnUpdated(addressName, entry);
         }
     }
 }
예제 #6
0
        /// <summary>
        /// Atualiza os dados do endereço de serviço informado.
        /// </summary>
        /// <param name="address">Instacia do endereço que será atualizada.</param>
        /// <param name="servicesContext">Contexto de serviços.</param>
        /// <returns>True caso o endereço tenha sido atualizado.</returns>
        public bool Update(ServiceAddress address, string servicesContext)
        {
            address.Require("address").NotNull();
            var key = new ServiceAddressKey(address.Name, servicesContext);
            ServicesConfigurationEntry entry = null;

            lock (_serviceAddress)
            {
                if (_serviceAddress.ContainsKey(key))
                {
                    _serviceAddress.Remove(key);
                    entry = new ServicesConfigurationEntry(address, servicesContext);
                    _serviceAddress.Add(key, entry);
                }
            }
            if (entry != null)
            {
                OnUpdated(key.Name, entry);
                return(true);
            }
            return(false);
        }