/// <summary>
        /// Elimina un seriovicio del repositorio y del origen de metadata de servicios.-
        /// </summary>
        /// <param name="providerName">Nombre del proveedor de metadata de servicios.-</param>
        /// <param name="serviceName">Nombre del servicio</param>
        public static void DeleteServiceConfiguration(string providerName, string serviceName)
        {
            ServiceProviderElement provider = GetProvider(providerName);

            ServiceConfigurationCollection svcList = GetAllServices(provider);

            if (!svcList.Exists(serviceName, provider.ApplicationId))
            {
                Exceptions.TechnicalException te = new Exceptions.TechnicalException(string.Format("El servicio {0} no se encuentra configurado.\r\nProveedor de Metadata: {1}\r\nApplicationId: {2}\r\n", serviceName, provider.Name, provider.ApplicationId));
                te.ErrorId = "7002";
                Fwk.Exceptions.ExceptionHelper.SetTechnicalException <ServiceMetadata>(te);

                throw te;
            }
            ServiceConfiguration wServiceConfigurationEnMemoria = svcList.GetServiceConfiguration(serviceName, provider.ApplicationId);

            svcList.Remove(wServiceConfigurationEnMemoria);

            if (provider.ProviderType == ServiceProviderType.xml)
            {
                XmlServiceConfigurationManager.DeleteServiceConfiguration(provider.SourceInfo, svcList);
            }
            else
            {
                DatabaseServiceConfigurationManager.DeleteServiceConfiguration(serviceName, provider.ApplicationId, provider.SourceInfo);
            }
        }
        /// <summary>
        /// Crea un servicio en el origen de datos indicado por el proveedor
        /// El aaplication Id que se utiliza es el del  nuevo servicio. Si el provedor estra configurado para usar uno determinado este se ignora
        /// de esta manera un proveedor puede insertar servicios para diferentes aplicaciones
        /// </summary>
        /// <param name="providerName">Nombre del proveedor de metadata de servicios.-</param>
        /// <param name="pServiceConfiguration"><see cref="ServiceConfiguration"/></param>
        public static void AddServiceConfiguration(string providerName, ServiceConfiguration pServiceConfiguration)
        {
            ServiceProviderElement provider = GetProvider(providerName);

            ServiceConfigurationCollection svcList = GetAllServices(provider);

            if (svcList.Exists(pServiceConfiguration.Name, pServiceConfiguration.ApplicationId))
            {
                Exceptions.TechnicalException te = new Exceptions.TechnicalException(string.Format("El servicio {0} ya existe.\r\nProveedor de Metadata: {1}\r\nApplicationId: {2}\r\n", pServiceConfiguration.Name, provider.Name, provider.ApplicationId));
                te.ErrorId = "7002";
                Fwk.Exceptions.ExceptionHelper.SetTechnicalException <ServiceMetadata>(te);
                throw te;
            }



            svcList.Add(pServiceConfiguration);

            if (provider.ProviderType == ServiceProviderType.xml)
            {
                XmlServiceConfigurationManager.AddServiceConfiguration(pServiceConfiguration, provider.SourceInfo, svcList);
            }
            else
            {
                DatabaseServiceConfigurationManager.AddServiceConfiguration(pServiceConfiguration, pServiceConfiguration.ApplicationId, provider.SourceInfo);
            }
        }
        /// <summary>
        ///
        /// </summary>
        public static void RefreshServices()
        {
            ServiceConfigurationCollection svcList = null;

            foreach (ServiceProviderElement provider in _ProviderSection.Providers)
            {
                _Repository.Remove(provider.Name);
                if (provider.ProviderType == ServiceProviderType.xml)
                {
                    svcList = XmlServiceConfigurationManager.GetAllServices(provider.SourceInfo);
                }
                if (provider.ProviderType == ServiceProviderType.sqldatabase)
                {
                    svcList = DatabaseServiceConfigurationManager.GetAllServices(provider.ApplicationId, provider.SourceInfo);
                }

                try
                {
                    //Se agrega try cath debido a que un subproseso pueda intentar agregar un item y aexistente
                    _Repository.Add(provider.Name, svcList);
                }
                catch (Exception)
                { }
            }
        }
        ///date:2013-03-02 No se utilizara la actualizacion
        //private static FileSystemWatcher watcher;

        /// <summary>
        /// Obtiene todos los servicios del proveedor de metadata
        /// </summary>
        /// <param name="provider">Proveedor de la metadata</param>
        /// <returns></returns>
        public static ServiceConfigurationCollection GetAllServices(ServiceProviderElement provider)
        {
            ServiceConfigurationCollection svcList = null;

            //Si no esta cargado el provider en el repositorio
            if (!_Repository.ContainsKey(provider.Name))
            {
                #region xml

                ///date:2013-03-02 No se utilizara la actualizacion
                if (provider.ProviderType == ServiceProviderType.xml)
                {
                    //{
                    svcList = XmlServiceConfigurationManager.GetAllServices(provider.SourceInfo);
                }

                //    //Habilito FileSystemWatcher para detectar cualquie cambio sobre la metadata
                //    watcher = new System.IO.FileSystemWatcher();
                //    watcher.Filter = provider.SourceInfo;

                //    watcher.Path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location;
                //    watcher.EnableRaisingEvents = true;

                //    watcher.Changed += new FileSystemEventHandler(watcher_Changed);

                //}
                #endregion

                #region sqldatabase
                if (provider.ProviderType == ServiceProviderType.sqldatabase)
                {
                    svcList = DatabaseServiceConfigurationManager.GetAllServices(provider.ApplicationId, provider.SourceInfo);
                }
                #endregion
                try
                {
                    ///Se agrega try cath debido a que un subproseso pueda intentar agregar un item y aexistente
                    _Repository.Add(provider.Name, svcList);
                }
                catch (Exception)
                { }
            }
            else
            {
                svcList = _Repository[provider.Name];
            }

            return(svcList);
        }
        ///date:2013-03-02 No se utilizara la actualizacion
        ///// <summary>
        ///// Si algun cambio ocurre en el archivo de metadata de algun proveedor xml
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //static void watcher_Changed(object sender, FileSystemEventArgs e)
        //{
        //    try
        //    {
        //        //Busco todos los providers que esten asociados al mismo archivo. Esta es una situacion muy rara pero podria darce
        //        foreach (ServiceProviderElement provider in _ProviderSection.Providers)
        //        {
        //            if (e.Name.Equals(provider.SourceInfo) && provider.ProviderType == ServiceProviderType.xml)
        //                ReloadAllServices(provider);
        //        }
        //    }
        //    catch (TechnicalException ex)
        //    {
        //        Fwk.Logging.Event ev = new Event();
        //        ev.LogType = EventType.Error;
        //        ev.Machine = ex.Machine;
        //        ev.User = ex.UserName;
        //        String str = string.Concat(
        //            "Se intento modificar la metadata de servicios y se arrojó el siguiente error \r\n",
        //            Fwk.Exceptions.ExceptionHelper.GetAllMessageException(ex),
        //            "\r\n la metadata se encuentra en: \r\n",
        //            e.FullPath);

        //        ev.Message.Text = str;

        //        Fwk.Logging.StaticLogger.Log(Fwk.Logging.Targets.TargetType.WindowsEvent, ev, null, null);

        //    }
        //}

        /// <summary>
        /// Este metodo elimina quita la lista de servicios del provider en el repositorio deservicios y
        /// los vuelve a cargar desde su origen
        /// </summary>
        /// <param name="provider">Proveedor de metadata</param>
        static void ReloadAllServices(ServiceProviderElement provider)
        {
            ///date:2013-03-02 No se utilizara la actualizacion
            //_Repository.Remove(provider.Name);

            if (provider.ProviderType == ServiceProviderType.xml)
            {
                ServiceConfigurationCollection svcList = XmlServiceConfigurationManager.GetAllServices(provider.SourceInfo);

                //    Habilito FileSystemWatcher para detectar cualquie cambio sobre la metadata
                //watcher = new System.IO.FileSystemWatcher();
                //watcher.Filter = provider.SourceInfo;
                //watcher.Path = System.Reflection.Assembly.GetExecutingAssembly().Location;
                //watcher.EnableRaisingEvents = true;

                //watcher.Changed += new FileSystemEventHandler(watcher_Changed);
            }
        }